2013-03-29 5 views
7
pow1 b e 
| (e == 0) = 1 
| otherwise = b * pow1 b (e-1) 

정확히 .hs 파일에 코드가 있고로드 할 때마다 항상 동일한 구문 분석 오류가 발생합니다. 나는 그것이 실제로 실수를 포함하고 있다고 생각하지 않는다. 그래서 나의 현재 생각은 "|" 기호는 haskell이 원하는 것은 아니지만 Macbook Keyboard (Mac OS 사용)의 표준 기호입니다. 가능합니까? 그렇다면 어떻게해야합니까? 현재 TextEdit을 사용하여 일반 텍스트 설정을 사용하여 코드를 작성합니다.Haskell - 입력에서 '|'구문 분석 오류가 발생했습니다.

+2

TextEdit보다는 Haskell (Vim, Emacs, Sublime Text 2)에 좋은 편집기를 사용하는 것이 좋습니다. –

답변

14

가드를 들여 씁니다. 하스켈에는 중요한 공백이 있습니다.

pow1 b e 
    | (e == 0) = 1 
    | otherwise = b * pow1 b (e-1) 
+3

그리고 공백으로 들여 쓰기, * not * tabs. (예 : 편집기가 탭을 공백으로 변환하는지 확인하십시오.) – huon

+2

하스켈은 사방에 괄호로 코드를 작성하지 않는 한 중요한 공백을 갖습니다. – amindfv

5

가드 앞쪽에 공백을 추가하면 코드가 올바르게 작동합니다.

pow1 b e 
    | (e == 0) = 1 
    | otherwise = b * pow1 b (e-1) 

(user142019는 이미이 솔루션을 언급하지만 나는 설명은 솔루션을 이해하는 데 필요한 느낌)

설명 :

하스켈의 구조와 범위를 제어하는 ​​공간 들여 쓰기를 사용합니다 그것은 코드입니다. 다른 프로그래밍 언어 (예 : 자바)는 중괄호를 사용하여 하스켈에 들여 쓰기를 사용합니다.

하스켈이 함수 본문이 함수 정의 및 다른 함수 정의보다 더 들여 쓰기 수준에 있기를 기대하기 때문에 코드가 작동하지 않습니다. 동일한 들여 쓰기 수준의 새 줄은 새로운 함수 정의로 해석 될 수 있습니다.이 함수 정의는 보호를 사용하여 시작할 수 없으므로 | 파싱 오류가 발생합니다.

Mac 문자 키나 텍스트 편집기에 아무런 문제가 없습니다.

들여 쓰기 항목 : 탭이 작동하지 않습니다. 따라서 공백을 수동으로 입력하거나 편집기의 탭 설정을 변경하여 탭 문자 대신 4 칸 (필자가 권장합니다)을 삽입해야합니다. (메모장 ++는이를 허용합니다. 하스켈과 함께 사용하는 것이 좋습니다.)

관련 문제