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
我不知道为什么它不起作用。
答案 0 :(得分:4)
在实例中,t
定义为Maybe'
,因此from'
必须包含Maybe' a -> a
类型。如果你写:
from2 :: Maybe' a -> a
然后它会起作用。该错误消息表明,您的类型签名声称from2
可以将t a
转换为a
任何选择的t
,但仅限您的定义如果t
为Maybe'
,则有效。
顺便说一下,此函数已在Maybe
模块中为标准Data.Maybe
类型定义为fromJust
,但您可能不应该使用它,因为它会给出如果您传递了Nothing
,则会收到无用的错误消息。当然,如果只是一个例子,那就没关系了。