Haskell : 함수 구성으로 인해 유형 불일치 오류가 발생했습니다.

아이스 맨

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는 유형 불일치 오류를보고합니다 (위의 세부 사항).foldingFuncflip $ uncurry (Map.insertWith (++))

이 경우 함수 구성이 오류 (유형 변경의 결과)로 이어진 이유를 누군가가 이해하도록 도와 줄 수 있습니까? 그리고 나는 무엇을 다르게해야합니까?

야 티마 2975

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 () []

유형 오류가 발생하는 곳입니다. (올바르게 추측했으면 좋겠습니다!)


이 문제를 해결하는 몇 가지 방법이 있습니다.

  1. 에 인수 추가 foldingFunction: 사용 foldingFunction m = (flip $ uncurry (Map.insertWith (++))) m하거나 더 좋으면 foldingFunction m (a,bs) = insertWith (++) a bs m작동하기 시작합니다.
  2. {-# LANGUAGE NoMonomorphismRestriction #-}파일 상단에 pragma를 추가 하거나 :set -XNoMonomorphismRestrictionghci의 명령 줄 에 입력 하여 대화식으로 수행 하여 단일 형태 제한을 해제합니다 .
  3. 최신 버전의 GHC로 업그레이드하십시오 (7.8.3이 트릭입니다).

기본적으로 DMR을 끄는 것과 확장 된 기본값 규칙은 ghci에 상당히 최근 (지난 몇 년) 추가 된 것이므로 사용중인 책이나 텍스트가 너무 오래되었을 수도 있습니다. :)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Haskell : 함수 구성으로 인해 유형 불일치 오류가 발생했습니다.

분류에서Dev

Python 3.4로 인해 유형 함수 오류가 발생했습니다.

분류에서Dev

유형 불일치 오류로 인해 Presto가 실패 함

분류에서Dev

Haskell-이 유형 불일치 오류를 이해할 수 없습니다.

분류에서Dev

Haskell zipWith 함수로 유형 불일치 오류 받기

분류에서Dev

이 호출과 일치하는 과부하가 없습니다. 마지막 과부하로 인해 다음 오류가 발생했습니다. ' "text"'유형은 ' "json"'유형에 할당 할 수 없습니다.

분류에서Dev

탐색 구성 요소 : parcelable 인수이지만 오류가 발생합니다. 유형 불일치 : 유추 된 유형이 학생이지만 문자열이 예상되었습니다.

분류에서Dev

예상 정규식 불일치로 인해 EncryptedDataBagItem.load 중에 Chef :: Exceptions :: ValidationFailed 오류가 발생했습니다.

분류에서Dev

.Find-SearchDirection에 변수를 넣으면 런타임 오류 13-유형 불일치가 발생합니다.

분류에서Dev

jar 파일 추가로 인해 Android 프로젝트 오류 발생 : 오류 1로 인해 Dalvik 형식으로 변환하지 못했습니다.

분류에서Dev

std :: thread ()에 템플릿 (사양없이)을 전달하면 오류가 발생합니다. <미해결 오버로드 된 함수 유형> 일치 오류

분류에서Dev

iproute2를 통한 인터페이스 생성으로 인해 "장치를 찾을 수 없음"오류가 발생했습니다.

분류에서Dev

Option Strict ON으로 인해 일부 오류가 발생했습니다.

분류에서Dev

Haskell의 오류 지수화로 인해 오류가 발생하지 않습니다.

분류에서Dev

Java : 와일드 카드 유형 불일치로 인해 컴파일 오류 발생

분류에서Dev

with_items의 여러 변수로 인해 오류가 발생했습니다.

분류에서Dev

Webpack을 통해 노드 모듈을 가져 오는 동안 오류가 발생했습니다. "이 파일 유형을 처리하려면 적절한 로더가 필요할 수 있습니다."

분류에서Dev

키를 문자열 인수로 함수에 전달할 때 vba Excel 오류 "by ref 인수 유형 불일치"

분류에서Dev

열거 형에서 임의 유형을 생성하는 정적 함수로 인해 "선택적 값을 풀 때 예기치 않게 nil을 찾았습니다"오류와 함께 충돌이 발생합니다.

분류에서Dev

유형 오류 함수 구독 불가

분류에서Dev

유형 별칭과 일치하지 않는 함수를 반환해도 오류가 발생하지 않습니다. 이유는 무엇입니까?

분류에서Dev

함수 인수로 특성 반복기와 유형 불일치

분류에서Dev

로그인 오류 : 예기치 않은 오류가 발생했습니다.

분류에서Dev

배열이있는 VBA Application.Index로 인해 유형 불일치 오류 13 발생

분류에서Dev

파일을 업로드하는 동안 오류가 발생했습니다. foreach ()에 대해 잘못된 인수가 제공되었습니다.

분류에서Dev

Haskell에서 다음 함수의 가장 일반적인 유형

분류에서Dev

Scala var 유형 사용으로 인해 유형 불일치 발생

분류에서Dev

boto3로 인해 EMRFS 메타 데이터 불일치가 발생할 수 있습니다.

분류에서Dev

TextArea 줄 바꿈으로 인해 오류가 발생했습니다. 다양한 문자 유형에 비해 값이 너무 깁니다 (1000).

Related 관련 기사

  1. 1

    Haskell : 함수 구성으로 인해 유형 불일치 오류가 발생했습니다.

  2. 2

    Python 3.4로 인해 유형 함수 오류가 발생했습니다.

  3. 3

    유형 불일치 오류로 인해 Presto가 실패 함

  4. 4

    Haskell-이 유형 불일치 오류를 이해할 수 없습니다.

  5. 5

    Haskell zipWith 함수로 유형 불일치 오류 받기

  6. 6

    이 호출과 일치하는 과부하가 없습니다. 마지막 과부하로 인해 다음 오류가 발생했습니다. ' "text"'유형은 ' "json"'유형에 할당 할 수 없습니다.

  7. 7

    탐색 구성 요소 : parcelable 인수이지만 오류가 발생합니다. 유형 불일치 : 유추 된 유형이 학생이지만 문자열이 예상되었습니다.

  8. 8

    예상 정규식 불일치로 인해 EncryptedDataBagItem.load 중에 Chef :: Exceptions :: ValidationFailed 오류가 발생했습니다.

  9. 9

    .Find-SearchDirection에 변수를 넣으면 런타임 오류 13-유형 불일치가 발생합니다.

  10. 10

    jar 파일 추가로 인해 Android 프로젝트 오류 발생 : 오류 1로 인해 Dalvik 형식으로 변환하지 못했습니다.

  11. 11

    std :: thread ()에 템플릿 (사양없이)을 전달하면 오류가 발생합니다. <미해결 오버로드 된 함수 유형> 일치 오류

  12. 12

    iproute2를 통한 인터페이스 생성으로 인해 "장치를 찾을 수 없음"오류가 발생했습니다.

  13. 13

    Option Strict ON으로 인해 일부 오류가 발생했습니다.

  14. 14

    Haskell의 오류 지수화로 인해 오류가 발생하지 않습니다.

  15. 15

    Java : 와일드 카드 유형 불일치로 인해 컴파일 오류 발생

  16. 16

    with_items의 여러 변수로 인해 오류가 발생했습니다.

  17. 17

    Webpack을 통해 노드 모듈을 가져 오는 동안 오류가 발생했습니다. "이 파일 유형을 처리하려면 적절한 로더가 필요할 수 있습니다."

  18. 18

    키를 문자열 인수로 함수에 전달할 때 vba Excel 오류 "by ref 인수 유형 불일치"

  19. 19

    열거 형에서 임의 유형을 생성하는 정적 함수로 인해 "선택적 값을 풀 때 예기치 않게 nil을 찾았습니다"오류와 함께 충돌이 발생합니다.

  20. 20

    유형 오류 함수 구독 불가

  21. 21

    유형 별칭과 일치하지 않는 함수를 반환해도 오류가 발생하지 않습니다. 이유는 무엇입니까?

  22. 22

    함수 인수로 특성 반복기와 유형 불일치

  23. 23

    로그인 오류 : 예기치 않은 오류가 발생했습니다.

  24. 24

    배열이있는 VBA Application.Index로 인해 유형 불일치 오류 13 발생

  25. 25

    파일을 업로드하는 동안 오류가 발생했습니다. foreach ()에 대해 잘못된 인수가 제공되었습니다.

  26. 26

    Haskell에서 다음 함수의 가장 일반적인 유형

  27. 27

    Scala var 유형 사용으로 인해 유형 불일치 발생

  28. 28

    boto3로 인해 EMRFS 메타 데이터 불일치가 발생할 수 있습니다.

  29. 29

    TextArea 줄 바꿈으로 인해 오류가 발생했습니다. 다양한 문자 유형에 비해 값이 너무 깁니다 (1000).

뜨겁다태그

보관