저는 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
문제 :
내 타입 시그니처는 두 번째 매개 변수가 목록의 목록이라고 말한다. 따라서 "s (x : y : xs)"에 대해 패턴 매칭을했을 때 x와 y는 목록 이되었습니다 . 하지만 저는 x와 y를 목록이 아닌 요소로 취급했습니다.
"무한 유형"오류 처리 지침 :
대부분의 경우이 오류가 발생하면 다루고있는 다양한 변수의 유형을 잊어 버리고 변수가있는 것과 다른 유형 인 것처럼 사용하려고 시도한 것입니다. 모든 것이 어떤 유형인지, 어떻게 사용하는지주의 깊게 살펴보면 일반적으로 문제가 발견됩니다.