此特定代码部分的目的是使 size
函数比简单地计算 elems
中的所有元素更有效。我已经决定对构成列表的两种类型求和,但我似乎无法创建大小函数的签名。
instance (Finite a, Finite b) => Finite (Either a b) where
elems = combineLists [Left x | x <- elems] [Right x | x <-elems]
size ??? = (size a) + (size b)
从 Prelude 中,我们知道要么 a b = 左 a |右b
。
我尝试的第一件事是匹配Either
,但当然它是一种类型,所以这不起作用。接下来,我尝试了 ((Left a) | (Right b))
,但也没有继续下去。似乎没有其他东西与类型 Either a b
匹配。
我能够获得 size (Left a)
进行编译,但由于它缺少 b
组件,我收到错误:
Ambiguous type variable `b' in the constraint:
`Finite b' arising from a use of `size' at <interactive>:1:0-12
这在上下文中当然是有意义的,但我真的不知道如何匹配Either a b
。
大家有什么想法吗?
最佳答案
某种类型的东西Either a b
是 Left a
或Right b
,因此您有两种可以单独处理的情况:
size (Left x) = size x
size (Right x) = size x
有关不明确类型变量的错误是一个单独的问题。
如果您只是输入类似 size (Left 1)
的内容进入解释器后,系统无法推断出该类型的“正确”类型 Left 1
值将是。可能是Either Int <i>anything</i>
只要不知道 <i>anything</i>
是什么类型是,无法检查它是否在类 Finite
中( size
需要)。
您可以通过指定显式类型签名来避免该问题:
size (Left 1 :: Either Int String)
关于haskell - 如何与类型 "Either a b"匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2309532/