私はハスケルを初め、「無限型を構築できません」というエラーに直面しています。なぜこのHaskellコードは "無限型"エラーを生成しますか?
実際には、このエラーが何を意味するのかについての良い説明を見つけることができませんでした。私の基本的な質問を超えて「無限のタイプ」のエラーを説明できれば、それ。
は、ここでは、コードです:
intersperse :: a -> [[a]] -> [a]
-- intersperse '*' ["foo","bar","baz","quux"]
-- should produce the following:
-- "foo*bar*baz*quux"
-- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]]
-- should produce the following:
-- [1,2,3,-99,4,5,6,-99,7,8,9]
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:y:xs) = x:s:y:intersperse s xs
そして、ここでインタプリタにロードしようとしているエラーです:
Prelude> :load ./chapter.3.ending.real.world.haskell.exercises.hs
[1 of 1] Compiling Main (chapter.3.ending.real.world.haskell.exercises.hs, interpreted)
chapter.3.ending.real.world.haskell.exercises.hs:147:0:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `intersperse'
Failed, modules loaded: none.
感謝。
- ここ
一部は、コードやHaskellでは "無限の種類" のエラーに対処するための一般的なガイドライン修正される:
修正されたコード
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) = x ++ s:intersperse s xs
何問題は:
私の署名の状態2番目のパラメータは、リストのリストです。したがって、「s(x:y:xs)」とパターンが一致すると、xとyはとなり、リストはとなりました。それでも、xとyはリストではなく要素として扱っていました。
「無限のタイプ」のエラーに対処するためのガイドライン:
あなたはこのエラーを取得するときに、あなたが扱っている様々な変数の型を忘れてしまった時、ほとんどの、そしてあなたあたかもそれが何か他のタイプであるかのように変数を使用しようとしました。すべてのタイプと使用方法を注意深く見てください。これは通常、問題を明らかにするでしょう。
別の良いヒント:型を明示的に宣言します。これにより、コンパイラは何かをチェックします。 –
これで問題は解決しますが、なぜコンパイラは「無限型を構築できませんか」と言います。どういう意味ですか?これらの操作をサポートしない型に対して操作を実行しようとしている場合、なぜコンパイラーはそのようなことを言っていませんか? – freedrull
+1(質問訂正された問題はガイドライン) – Dacav