私は Haskell のプロではありません。今日、私は型システムに関してやや奇妙な経験をしました。この 2 行目は型エラーを引き起こします。問題はmaxdiag (as:bs:cs:ds)
2 行目のビットです。
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'
2 行目の問題のある部分を に変更すると、次の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))
成功します。私の質問は
- このエラーはどういう意味ですか?
- なぜそれが起こったのですか?
- これら 2 つの一見異なることが問題を解決するのはなぜですか?