2010-11-25 15 views
2

私はまだハスケルの基礎を学んでいますが、私はこの単純な質問に対する答えを見つけようとしていますので、事前に謝ります。ハスケルでの型比較

は考える:

data Fruit = Fruit| Apple | Orange 
    deriving (Show, Eq) 

a = Apple 

は、どのように私はいくつかのaはフルーツであるかどうかをチェックしますか?

+0

を使用し、あなたがGHCiのを使用している場合ちなみに

fruitName :: Fruit -> String fruitName Fruit = "Fruit" fruitName Apple = "Apple" fruitName Orange = "Orange" 

、あなたが何かの種類を知りたい:これを行うには、パターンマッチングを使用しますなぜあなたがこれを望んでいるのか正確に知っている。 – sclv

+0

@sclv:上記のプログラムが与えられれば、a == AppleはTrueを返します。 a == FruitはFalseを返します。私はいくつかの変数が果物であるかどうかをどのように伝えるか知りたいだけです。複雑ではありません。 Apple == Fruitはfalseを返します。おそらく、データと型コンストラクタが同じ名前であるため、混乱するかもしれません。それで、データFruitTypeをデータFruitTypeに置き換えてください...、私はまだFruitTypeに関連していることを確認する方法を見つけることができません。 –

答えて

9

あなたが実際にタイプのを比較したと仮定すると、簡単な答えは「できません」です。 Haskellは静的に型付けされているので、コンパイル時にチェックされ、実行時には行われません。だから、あなたがこのような機能を持っている場合:

foo :: Fruit -> Bool 
foo Apple = True 
foo x  = False 

をフルーツであるxかどうかの答えは常に「はい」となります。

あなたがしようとしていることは、与えられた値がどのようなデータコンストラクタで構築されたかを調べることです。私が興味があると思い:t

> let a = 123 
> :t a 
a :: Integer 
> 
+0

@Joey Adams:私はアップルを持っています。データコンストラクタであるFruit(型コンストラクタ、Appleとは対照的に)を返す関数が必要です。その音から、私はまだ使用する必要がありますあなたの例のように、fruitNameというApple = "Apple"の代わりにfruitName Apple = "Fruit"を使って、データのコンストラクタ名を決めるために、パターンマッチングを行い、自分自身で関数を作ります(Preludeでは何もありません)。 –

+0

@Richard Hein:これをアーカイブするには 'Typeable'を使うことができます。しかし、それは悪です。 – fuz

+0

@Joey Adams:GHCiの私の質問に私の小さなプログラムをロードし、aをタイプすると、 "a :: Fruit"が得られます。私は同じことを返す関数を必要とします:GHCiで型が行います。 –