2016-09-22 5 views
0

私は、データ型インスタンスの使用のイラストレーション(退屈な単純なもの)ですすなわち、異なるデータに対して異なる挙動を定義することができる。データ型インスタンス?

もしそうでなければ、どのように使用できますか?

コード:彼らはどんな違いがありませんので

data HealthIndicators = Weight | Age | BloodPressure deriving (Show) 
data IrrelevantIndicators = Starsign | BirthMonth | IQ deriving (Show) 

class IndicatorTest a where 
    indicatortest :: a -> Bool 

instance IndicatorTest HealthIndicators where 
    indicatortest Weight = True 
    indicatortest Age = True 
    indicatortest BloodPressure = True 

instance IndicatorTest IrrelevantIndicators where 
    indicatortest Starsign = False 
    indicatortest BirthMonth = False 
    indicatortest IQ = False 
+0

タイプセーフな(平等)(https://hackage.haskell.org/package/base-4.9.0.0/docs/Prelude.html#t:Eq)、注文などを簡単に定義することができます。型クラスがより上位の類別型(例えば、[monads]​​(https://hackage.haskell.org/package/base-4.9.0.0/docs/Prelude.html#t)のようなものである可能性があるという事実にまで達していません:Monad)または矢印) – Alec

+0

これは本当ですが、通常は2つの異なる機能を使用します。あるいは、異なるモジュールに2つの同じ名前の関数を定義することもできます。大部分のケースでは、OOPのように動的ディスパッチは必要ありません。それでも、あなたの例は技術的には正しいですが、 'Ord、Eq、Show、Monoid、...'ははるかに興味深く一般的です。あなたはそれらを見たいかもしれません。 – chi

+0

はい、可能な目標の1つは、さまざまなデータタイプに共通の用途を見つけることです。これは、上記のデータ型の元の著者が想像していなかったものを使用することもあります。つまり、私はこの例が素晴らしいデータモデルであるとは確信していません。 – Ingo

答えて

0

まず、あなたのインスタンスはすべてのケースをリストする必要はありません。あなたは

instance IndicatorTest HealthIndicators where 
    indicatortest _ = True 

を書くことができるまたはあなたが好む場合は、2行目は

indicatortest = const True 

あなたはこのような機能を記述している場合、これは便利かもしれないことができます。

foo :: (IndicatorTest h) => h -> String 

を、あなたが必要ですその結果はタイプhが有用な指標であるかどうかによって異なる。しかし、その場合はおそらく "foo"をIndicatorTestクラスの関数にするでしょう。

あなたが実際に達成しようとしていることを知らなくても、それ以上アドバイスするのは少し難しいです。

関連する問題