나는 하스켈을 처음 접했고 "무한한 타입을 만들 수 없다"라는 오류에 직면했다.왜이 하스켈 코드가 "무한 타입"오류를 생성합니까?
실제로이 오류가 무엇을 의미하는지에 대한 좋은 설명을 찾을 수 없었기 때문에 기본 질문을 뛰어 넘어 "무한 유형"오류에 대해 설명해 주시면 감사하겠습니다. 그것.
여기에 코드입니다 :
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.
감사합니다.
수정 코드
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) = x ++ s:intersperse s xs
무엇을 : -
여기
는 일부 코드와 하스켈에서 "무한 유형"오류 처리에 대한 일반적인 가이드 라인을 수정입니다 문제는 다음과 같습니다.
내 서명 서명 상태 intersperse에 대한 두 번째 매개 변수는 목록의 목록입니다. 따라서 "(x : y : xs)"와 패턴이 일치하면 x와 y는 이되고이됩니다. 그리고 x와 y를 원소가 아닌리스트로 취급하고있었습니다. 은 "무한 유형"오류를 처리하는
가이드 라인 :
이 오류를 얻을 때 대부분의 시간, 당신은 당신이 상대하고있는 다양한 변수의 종류를 잊어하고있다 변수를 다른 유형처럼 사용하려고했습니다. 모든 유형의 사용법과 사용 방식을주의 깊게 살피십시오. 그러면 일반적으로 문제가 발견됩니다.
또 다른 유용한 팁 : 유형을 명시 적으로 선언하십시오. 이렇게하면 컴파일러가 확인할 내용을 제공합니다. –
그래서 문제가 해결되지만 컴파일러에서 "무한 타입을 생성 할 수 없습니까?"라고 말하는 이유는 무엇입니까? 그게 무슨 뜻 이죠? 문제가 이러한 연산을 지원하지 않는 유형의 연산을 수행하려고한다면 컴파일러가 그런 식으로 말하지 않는 이유는 무엇입니까? – freedrull
질문 구조 (질문 - 정정 - 문제 - 지침)에 대한 +1 – Dacav