인쇄를 컴파일하는 동안 오류가 발생했습니다.

알렉산더

간단한 코드 조각을 컴파일하려고합니다.

main = (putStrLn . show) (Right 3.423)

컴파일 결과 다음 오류가 발생합니다.

No instance for (Show a0) arising from a use of `show'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
  instance Show Double -- Defined in `GHC.Float'
  instance Show Float -- Defined in `GHC.Float'
  instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
    -- Defined in `GHC.Real'
  ...plus 42 others
In the second argument of `(.)', namely `show'
In the expression: putStrLn . show
In the expression: (putStrLn . show) (Right 3.423)

ghci에서 동일한 스 니펫을 실행하면 모든 것이 예상대로 작동합니다.

Prelude> let main = (putStrLn . show) (Right 3.423)
Prelude> main
Right 3.423

그래서 문제는 무슨 일이 일어나고 있는가?

bheklilr

문제는 GHC이의 모든 유형을 결정 할 수 없다는 것입니다 Right 3.423 IS, 그것은 단지 그것을 유형이 있음을 확인할 수 있습니다 Either a Double , 그리고 인스턴스 Show 에 대한 Either 같은 모습을 instance (Show a, Show b) => Show (Either a b) . 에 대한 추가 제약이 없으면 Either a Double GHC는 인쇄 방법을 모릅니다.

이 대화 형 모드에서 작동하는 이유는 때문이다 무서워 단사 사상의 제한 이 선택 기본값에 GHCi 더 공격적으로합니다. 이 기능은으로 비활성화 할 수 있으며 :set -XNoMonomorphismRestriction초보자에게 많은 문제가 발생하므로 향후 GHC 버전에서 기본값이 될 것입니다.

이 문제에 대한 해결책은 다음 Right 3.423과 같이 소스 코드 에 유형 서명을 넣는 것입니다.

main = (putStrLn . show) (Right 3.423 :: Either () Double)

우리는 어쨌든 그것에 대해 신경 쓰지 않고 보여줄 수있는 "가장 단순한"유형이기 때문에 여기서 방금 사용 ()했습니다 a. 구현하는 한 String또는 Int또는 Double또는 원하는 것을 거기에 넣을 수 Show있습니다.

putStrLn . show은 정확히의 정의 print이므로 할 수 있습니다.

main = print (Right 3.423 :: Either () Double)


@ ØrjanJohansen이 지적했듯이 이것은 단 형성 제한이 아니라 ExtendedDefaultRulesGHCi가 사용 하는 확장입니다. 기본적으로 위에서 한 작업을 정확히 ()수행하고 대화 형 세션에서 작업을 수행하기 위해 유형 변수를 밀어 넣 습니다.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Boost.Bind를 컴파일하는 동안 오류가 발생했습니다.

분류에서Dev

VBA 컴파일 오류 : 차트 범위를 설정하는 동안 구문 오류가 발생했습니다.

분류에서Dev

중고품 생성 클래스를 Java 1.5로 컴파일하는 동안 오류가 발생했습니다.

분류에서Dev

가장 큰 상자의 부피와 길이, 너비 및 높이를 인쇄하려고 시도하는 동안 컴파일 오류가 발생했습니다.

분류에서Dev

JavaFX WorkerStateEvent에서 람다를 컴파일하는 동안 오류가 발생했습니다.

분류에서Dev

numba JIT 컴파일러를 pip하는 동안 오류가 발생했습니다.

분류에서Dev

gfortran으로 f77 내장 함수를 컴파일하는 동안 오류가 발생했습니다.

분류에서Dev

Linux From Scratch : binutils 2.32를 컴파일하는 동안 오류가 발생했습니다.

분류에서Dev

Tk / Tcl 확장 : BLT를 컴파일하는 동안 오류가 발생했습니다.

분류에서Dev

명령 줄에서 sizeof로 C 코드를 컴파일하는 동안 오류가 발생했습니다.

분류에서Dev

파일 세트를 복사하는 동안 오류가 발생했습니다.

분류에서Dev

pyotherside를 만드는 동안 오류가 발생했습니다.

분류에서Dev

배치 파일에서 값을 읽고 인쇄하는 동안 오류가 발생했습니다.

분류에서Dev

배치 파일에서 값을 읽고 인쇄하는 동안 오류가 발생했습니다.

분류에서Dev

C에서 배열 요소의 주소를 인쇄하는 동안 오류가 발생했습니다.

분류에서Dev

R의 Antitrust Package에서 결과를 인쇄하는 동안 오류가 발생했습니다.

분류에서Dev

Ajax 데이터를 html 테이블로 인쇄하는 동안 오류가 발생했습니다.

분류에서Dev

for 루프에서 컴파일하는 동안 오류가 발생했습니다.

분류에서Dev

인쇄하는 동안 UnicodeEncodeError가 발생했습니다.

분류에서Dev

C에서 디버그 인쇄 매크로를 만드는 동안 오류가 발생했습니다.

분류에서Dev

오류 원인 : XML '파일의 조기 끝'을 처리하는 동안 오류가 발생했습니다.

분류에서Dev

C ++의 상속이 작동하지 않습니다. 아래 C ++ 코드를 컴파일하는 동안 링커 오류가 발생했습니다.

분류에서Dev

Yeoman 생성기를 시작하는 동안 오류가 발생했습니다.

분류에서Dev

Pandas를 사용하여 csv 파일을 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

Pandas를 사용하여 csv 파일을 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

gstreamer API를 사용하여 .wav 파일을 재생하는 동안 오류가 발생했습니다.

분류에서Dev

프로젝트를 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

msql db를 solr로 가져 오는 동안 오류가 발생했습니다.

분류에서Dev

HTML 코드를 가져 오는 동안 오류가 발생했습니다.

Related 관련 기사

  1. 1

    Boost.Bind를 컴파일하는 동안 오류가 발생했습니다.

  2. 2

    VBA 컴파일 오류 : 차트 범위를 설정하는 동안 구문 오류가 발생했습니다.

  3. 3

    중고품 생성 클래스를 Java 1.5로 컴파일하는 동안 오류가 발생했습니다.

  4. 4

    가장 큰 상자의 부피와 길이, 너비 및 높이를 인쇄하려고 시도하는 동안 컴파일 오류가 발생했습니다.

  5. 5

    JavaFX WorkerStateEvent에서 람다를 컴파일하는 동안 오류가 발생했습니다.

  6. 6

    numba JIT 컴파일러를 pip하는 동안 오류가 발생했습니다.

  7. 7

    gfortran으로 f77 내장 함수를 컴파일하는 동안 오류가 발생했습니다.

  8. 8

    Linux From Scratch : binutils 2.32를 컴파일하는 동안 오류가 발생했습니다.

  9. 9

    Tk / Tcl 확장 : BLT를 컴파일하는 동안 오류가 발생했습니다.

  10. 10

    명령 줄에서 sizeof로 C 코드를 컴파일하는 동안 오류가 발생했습니다.

  11. 11

    파일 세트를 복사하는 동안 오류가 발생했습니다.

  12. 12

    pyotherside를 만드는 동안 오류가 발생했습니다.

  13. 13

    배치 파일에서 값을 읽고 인쇄하는 동안 오류가 발생했습니다.

  14. 14

    배치 파일에서 값을 읽고 인쇄하는 동안 오류가 발생했습니다.

  15. 15

    C에서 배열 요소의 주소를 인쇄하는 동안 오류가 발생했습니다.

  16. 16

    R의 Antitrust Package에서 결과를 인쇄하는 동안 오류가 발생했습니다.

  17. 17

    Ajax 데이터를 html 테이블로 인쇄하는 동안 오류가 발생했습니다.

  18. 18

    for 루프에서 컴파일하는 동안 오류가 발생했습니다.

  19. 19

    인쇄하는 동안 UnicodeEncodeError가 발생했습니다.

  20. 20

    C에서 디버그 인쇄 매크로를 만드는 동안 오류가 발생했습니다.

  21. 21

    오류 원인 : XML '파일의 조기 끝'을 처리하는 동안 오류가 발생했습니다.

  22. 22

    C ++의 상속이 작동하지 않습니다. 아래 C ++ 코드를 컴파일하는 동안 링커 오류가 발생했습니다.

  23. 23

    Yeoman 생성기를 시작하는 동안 오류가 발생했습니다.

  24. 24

    Pandas를 사용하여 csv 파일을 가져 오는 동안 오류가 발생했습니다.

  25. 25

    Pandas를 사용하여 csv 파일을 가져 오는 동안 오류가 발생했습니다.

  26. 26

    gstreamer API를 사용하여 .wav 파일을 재생하는 동안 오류가 발생했습니다.

  27. 27

    프로젝트를 가져 오는 동안 오류가 발생했습니다.

  28. 28

    msql db를 solr로 가져 오는 동안 오류가 발생했습니다.

  29. 29

    HTML 코드를 가져 오는 동안 오류가 발생했습니다.

뜨겁다태그

보관