函数和类之间的类型签名

时间:2012-03-22 20:29:37

标签: haskell

data Maybe' a = Nothing' | Just' a deriving (Show)

class From' t 
    where from' :: t a -> a

instance From' Maybe' 
    where from' (Just' x) = x

这很有效。

但是...

from2 :: t a -> a 
from2 (Just' x)  = x

Couldn't match type `t' with `Maybe''
  `t' is a rigid type variable bound by
      the type signature for from2 :: t a -> a at test.hs:11:1
In the pattern: Just' x
In an equation for `from2': from2 (Just' x) = x

我不知道为什么它不起作用。

1 个答案:

答案 0 :(得分:4)

在实例中,t定义为Maybe',因此from'必须包含Maybe' a -> a类型。如果你写:

from2 :: Maybe' a -> a
然后它会起作用。该错误消息表明,您的类型签名声称from2可以将t a转换为a 任何选择的t,但仅限您的定义如果tMaybe',则有效。

顺便说一下,此函数已在Maybe模块中为标准Data.Maybe类型定义为fromJust,但您可能不应该使用它,因为它会给出如果您传递了Nothing,则会收到无用的错误消息。当然,如果只是一个例子,那就没关系了。