如何将一个字符等同于 Haskell 中的类型参数?

问题描述 投票:0回答:1

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
的显式实例?

haskell instance typeclass
1个回答
0
投票

您正在使用

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
© www.soinside.com 2019 - 2024. All rights reserved.