왜 Haskell 인터프리터 (GHCI 7.10.3)는 let 표현식에 함수 정의가 필요하지만 Haskell 컴파일러 (GHC 7.10.3)는 파서 오류를 발생시킵니다. 함수 정의가 let 표현식 안에 있습니까?컴파일 된 대 해석 : Letter/Not To Let
"Learn You a Haskell for Great Good!" 아기의 첫 번째 기능은 doubleMe입니다 : doubleMe x = x + x
왜 let이 표현식 안에 있으면 인터프리터가이 정의를 허용하고 '='입력에 구문 분석 오류가 발생합니까? 한편, 같은 함수를 파일에서 컴파일하는 경우, 함수 정의가 let 표현식 내에 있고 let 표현식 내에 있지 않으면 정의를 컴파일하면 GHC가 구문 분석 오류를 발생시키는 이유는 무엇입니까? Lisp 배경에서 왔을 때, 나는 대화식 Haskell과 파일 로딩 및 컴파일 Haskell이 이러한 정의를 다르게 취급한다는 것에 놀랐다.
규칙이 있습니다. GHCi가 .hs 파일에 쓰는 것과 똑같이 작동한다면'1 + 1'을 쓰는 것은'print (2,3)'뿐만 아니라 오류가 될 것입니다. 대신, GCHi는 약간의 마법을 사용하여 이러한 표현과 '정의'를 모두 허용했습니다. let없이'x = 1'이 거부되는 이유에 대해 - 나는 더 많은 마법이 필요하다는 것을 제외하고는 명확한 답이 없다고 생각합니다. – chi
오른쪽. FWIW, [IHaskell] (https://github.com/gibiansky/IHaskell)은 두 스타일을 혼합 할 수 있습니다. – leftaroundabout
GHCi (8.0.1)의 최신 버전은'doubleMe x = x + x'를 허용합니다. 당신과 같은 사람들이 이것에 대한 특별한 사례를 추가했다고 불평했습니다. :) – Alec