MRE:
data MRE a = Blah | Eh a | Umm (MRE a) (MRE a) deriving (Eq, Ord, Show)
-- function:
foo :: Eq a => Char -> MRE a -> Bool
-- pattern match on Blah here --
foo x (Eh e)
| x == e = True
| otherwise = False
错误:
Couldn't match expected type ‘Char’ with actual type ‘a’
‘a’ is a rigid type variable bound by
有没有办法解决这个问题,使
MRE a
成为 Eq
的显式实例?
您正在使用
x == e
,但 x
是 Char
,并且 e
属于 a
类型。如果您因此添加 Eq a
类型约束,则可以使用 (==)
,但前提是两个操作数是 a
。
如果
a
是 Char
:,则此方法有效
foo :: Char -> MRE Char -> Bool
foo x (Eh e) = x == e
或者您需要注入一个函数来将
a
与 Char
进行比较,所以:
foo :: (a -> Char -> Bool) -> a -> MRE Char -> Bool
foo f x (Eh e) = f x e