2010-11-25 125 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 
>