[英]Why is Haskell throwing a 'cannot construct infinite type' error?
我在Haskell中编写了以下代码来计算两个向量的点积,但由于以下错误而无法编译它:
cannot construct infinite type: a = [a] When generalising the type(s) for dot'
dot :: (Num a) => [a] -> [a] -> a
[] `dot` [] = 0
x@[xi,xs] `dot` y@[yi,ys] = xi*yi + (xs `dot` ys)
我事先看过这个问题以获得指导。 据我所知,类型是正确的。 x,y和两个[]是列表,函数返回一个数字。
怎么了?
Ganesh的回答很明显。 让我简要阐述一下“无限型”的含义。
dot
有这种类型定义:
dot :: (Num a) => [a] -> [a] -> a
这意味着dot
需要两个Num
元素列表并返回Num
。 您的定义包括以下行:
x@[xi,xs] `dot` y@[yi,ys] = xi*yi + (xs `dot` ys)
因为,正如Ganesh指出的那样, [xi,xs]
是由两个元素组成的列表, xi
和xs
应该是Num
s。 对于yi
和ys
。 但随后它们作为参数传递给dot
:
xs `dot` ys
这意味着xs
和ys
必须是Num
s的列表。 这导致了矛盾。
另一种看待这种情况的方法是暂时忘记dot
的类型定义。 这条线,
x@[xi,xs] `dot` y@[yi,ys] = xi*yi + (xs `dot` ys)
表示dot
采用两个列表,其元素是dot
适当参数。 但唯一有意义的方法是,这些列表是否是无限嵌套的 。 这是不允许也不明智的。
您将两个元素列表[x, y]
的语法与将列表拆分为第一个元素和列表的其余部分(x:y)
的语法混淆。 试试这个:
dot :: (Num a) => [a] -> [a] -> a
[] `dot` [] = 0
x@(xi:xs) `dot` y@(yi:ys) = xi*yi + (xs `dot` ys)
@
模式也是不必要的,顺便说一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.