TL; DR : 어떤 순수 함수의 합성으로 인해 GHCi의 타입 불일치 에러를 야기 할 수 있는가? GHCi가 다음 코드를 평가하는 것은 이상합니다.
foldl (a . b . c) crackle pop <- GHCi evaluates this`
... 다음을 평가하려고 시도한 후에 만 오류를 제공합니다.
let snap = a . b . c <- GHCi evaluates this
foldl snap crackle pop <- GHCi reports an error (!)
더 긴 버전 :
나는 내가 여기 GHCi에서 관찰하고있는 것에 당황하고 누군가 그것을 설명 할 수 있기를 바란다 (이미지 아래에 설명 포함) :
위에서 무엇을 볼 수 있습니까? :
먼저 b
다음 목록에 바인딩 된 변수가 있습니다 [(2,["Dipak"]), (2,["Andrew"]),(2,["Keone"])]
.. b
유형 [(Int,[String])]
입니다. ( ghci>
위 스크린 샷 의 첫 번째 프롬프트와 결과 출력을 참조하십시오 .)
그런 다음에서 접기를 수행 b
하여 다음 유형으로 변환합니다 Map (Integer, [String])
.. 맵인 insertWith (++)
시작 누산기를 기반으로 접기 기능을 사용하여이를 수행 empty
합니다. 기능은 다음과 같습니다 ( ghci>
위 스크린 샷 의 두 번째 프롬프트 다음에 나오는 것과 동일 ghci>
합니다. 위의 두 번째 프롬프트 참조 ).
foldl' (flip $ uncurry (Map.insertWith (++))) (Map.fromList []) b
좋아; 여태까지는 그런대로 잘됐다
주어진 foldl'
길기도이었다 함수 위, I는 (라는 폴딩 기능 구성 결정 foldingFunc
동등했다) flip $ uncurry (Map.insertWith (++))
. 이것은 단순히 foldl'
위의 표현식에서의 첫 번째 인수입니다 . ( 위 let
의 세 번째 ghci>
프롬프트의 표현식을 참조하십시오 .)
이것이 내가 혼란스러워하는 곳입니다. 일상적인 검사로서, 나는 단순히 외관상의 변경이어야하는 (대체 )를 foldl'
제외하고는 위와 동일 하게 수행합니다 . 그리고 이제 GHCi는 유형 불일치 오류를보고합니다 (위의 세부 사항).foldingFunc
flip $ uncurry (Map.insertWith (++))
이 경우 함수 구성이 오류 (유형 변경의 결과)로 이어진 이유를 누군가가 이해하도록 도와 줄 수 있습니까? 그리고 나는 무엇을 다르게해야합니까?
ghci의 확장 된 기본 규칙과 Dreaded Monomorphism Restriction의 역동적 인 듀오가 다시 파업합니다!
나는 당신이 약간 오래된 ghci, 버전 7.6 또는 그 이전을 사용하고 있다고 생각합니다.
일어나는 일은 foldingFunction
가장 일반적인 유형으로
foldingFunction :: Ord a => Map a [b] -> (a,[b]) -> Map a [b]
그러나 인수가없는 최상위 정의이고 ghci 버전에는 여전히 단 형성 제한이 있기 때문에 이것은 '좋은'유형 (컨텍스트 때문에 다형성 Ord a
)이 아니며 기본 규칙이 시작됩니다. 에 대한 기본 인스턴스 찾기 Ord a
-일반적으로 이것은 실패 할 것입니다 ( Num
같은 제약 조건 이 없기 때문에 ). 그러나 ghci는 ()
가능한 기본값으로 간주 합니다. 작동하므로 ghci에게 유형 을 요청 foldingFunction
하면
foldingFunction :: Map () [b] -> ((), []) -> Map () []
유형 오류가 발생하는 곳입니다. (올바르게 추측했으면 좋겠습니다!)
이 문제를 해결하는 몇 가지 방법이 있습니다.
foldingFunction
: 사용 foldingFunction m = (flip $ uncurry (Map.insertWith (++))) m
하거나 더 좋으면 foldingFunction m (a,bs) = insertWith (++) a bs m
작동하기 시작합니다.{-# LANGUAGE NoMonomorphismRestriction #-}
파일 상단에 pragma를 추가 하거나 :set -XNoMonomorphismRestriction
ghci의 명령 줄 에 입력 하여 대화식으로 수행 하여 단일 형태 제한을 해제합니다 .기본적으로 DMR을 끄는 것과 확장 된 기본값 규칙은 ghci에 상당히 최근 (지난 몇 년) 추가 된 것이므로 사용중인 책이나 텍스트가 너무 오래되었을 수도 있습니다. :)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다