我不是 Haskell 专业人士。今天我对今天的类型系统有一个有点奇怪的经历。第二行将导致类型错误。问题是maxdiag (as:bs:cs:ds)
第二行的一点:
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))
它成功。我的问题是
- 这个错误是什么意思?
- 为什么会发生?
- 为什么这两个看似不同的东西可以解决它?