2010-11-25 217 views
2

我還在學習Haskell的基礎知識,我試圖找到這個簡單問題的答案,所以我提前道歉,因爲我確信它很簡單。Haskell中的類型比較

考慮:

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

a = Apple 

如何檢查是否存在一個是果?

+0

我很感興趣確切知道你爲什麼要這樣做。 – sclv 2010-11-25 19:43:17

+0

@sclv:鑑於上面的程序,== Apple會返回True。 ==水果返回False。我只想知道我是如何告訴如果某個變量是一個水果。沒什麼複雜。 Apple == Fruit也返回false。也許這很令人困惑,因爲數據和類型構造函數都是相同的名稱。好的,所以用數據FruitType替換數據Fruit,我仍然無法找到某種方式來檢查a是否與FruitType相關。 – 2010-11-25 21:34:46

回答

9

假設你的意思是類型比較,簡單的答案是「你不行」。 Haskell是靜態類型的,所以檢查是在編譯時完成的,而不是運行時完成的。所以,如果你有這樣的功能:

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

與否x答案是水果永遠是「是」。

你可能試圖做的是找出構造給定值的數據構造函數。要做到這一點,使用模式匹配:

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

順便說一句,如果你使用GHCI,和你想知道的東西的類型,使用:t

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