我不是一个Haskell专业版。今天,我对今天的类型系统有了一些奇怪的体验。这第二行会导致类型错误。问题是maxdiag (as:bs:cs:ds)
位下联:Typecheck奇怪列表清单
maxdiag ((a:as):(b:bs):(c:cs):(d:ds):xs) len =
maximum [a*(bs !! 0)*(cs !! 1)*(ds !! 2), maxdiag (as:bs:cs:ds) (len-1)]
它失败,出现以下错误:
Occurs check: cannot construct the infinite type: a0 = [a0]
Expected type: [[a0]]
Actual type: [a0]
In the second argument of `(:)', namely `ds'
In the second argument of `(:)', namely `cs : ds'
当我改变第二行maxdiag (as:bs:cs:ds:xs)
的违规一部分,所以它读取
maxdiag ((a:as):(b:bs):(c:cs):(d:ds):xs) len =
maximum [a*(bs !! 0)*(cs !! 1)*(ds !! 2), maxdiag (as:bs:cs:ds:xs) (len-1)]
...然后没有错误。同样,如果我将它替换为maxdiag (as:bs:cs:(ds:xs))
它会成功。我的问题是
- 这个错误是什么意思?
- 它为什么发生?
- 为什么这两个看似不同的东西解决了它?
+1的最后一段 – amindfv
我并没有包括对功能的任何其它方面(即其他模式),特别是因为我不想真正的问题,这是不是它不是那些patterns.But复杂一个强大的程序或任何东西的一部分,我只是乱搞类型系统以获取错误的挂起。我永远不会写这样的代码。 :P – apc