代码的这个特定部分的目的是使size
函数比简单计算elems
中的所有元素更有效。我已经解决了总结构成列表的两种类型,但我似乎无法创建大小函数的签名。如何匹配类型“任一b”?
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)
从前奏,我们知道Either a b = Left a | Right 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
。
有人有什么想法吗?
您似乎对类型和构造函数之间的区别有点困惑。 “一个b”是一个带有两个构造函数的类型,“左”和“右”。类型进入类型签名,而构造函数进入代码。这是一个常见的混淆,因为很多类型使用相同的名称作为类型和构造函数,如“data Foo = Foo Int String”;第一个“Foo”是类型,而第二个是构造函数。 – 2010-02-25 20:17:03