2014-02-09 3 views
0

다음은 하스켈 코드 샘플입니다.

indentBrackets (c:rest) level 
    | c=='(' = "\n" ++ (replicate level ' ') ++ [c] 
         ++ (indentBrackets rest (level+1)) 
    | c==')' = [c] ++ (indentBrackets rest (level-1)) 
    | c=='[' = "\n" ++ (replicate level ' ') ++ [c] 
         ++ (indentBrackets rest (level+1)) 
    | c==']' = [c] ++ (indentBrackets rest (level-1)) 
    | otherwise = [c] ++ (indentBrackets rest (level )) 

indentBrackets [] _ = "" 

내가 otherwise = [c] ++ $ indentBrackets rest (level)otherwise = [c] ++ (indentBrackets rest (level))을 교체하는 경우, 내가 얻을

SRC \ Main.hs : 182 : 25 : 입력에 오류를 구문 분석하는`$ '

가 확인을해야하지 ?

답변

14

예, 괜찮습니다.

$ 연산자는 완벽하게 일반 중위 연산자입니다 : 당신이 (각각, 함수 및 인수)이 표현 사이에 사용할 수 있습니다 또는 섹션을 형성 할 수 있습니다.

[c] ++ $ indentBrackets rest (level) -- parse error on input `$' 

에서이 잘못된 이유는 ++ 운영자가 완벽하게 평범한 중위 연산자이다 : 당신이 (각각 접두사와 접미사)이 표현 사이에 사용할 수 있습니다 또는 섹션을 형성 . 문제는 [c] ++이 표현식이 아니라는 것입니다. 당신이 특정 응용 프로그램에 대한 $를 사용하는 것이 어리석게 판단되는 경우

, 당신은 인, ([c] ++)에 섹션

([c] ++) $ indentBrackets rest (level) -- should be fine 

에게 조작부를 브래킷의 추가 설정을 구분하고, 실제로 문제를 고칠 수 있습니다 underapplied 중위 연산자, 여기서 접미어를 기다리는 함수를 반환합니다. 모든에서 괄호 나 여기 $필요하지 않습니다

+3

, 그것은 서로 옆에 두 개의 연산자를 가질 수있는 구문 분석 오류는 다음과 같습니다 덧붙여

indentBrackets (c:rest) level | c=='(' = "\n" ++ replicate level ' ' ++ [c] ++ indentBrackets rest (level+1) | c==')' = [c] ++ indentBrackets rest (level-1) | c=='[' = "\n" ++ replicate level ' ' ++ [c] ++ indentBrackets rest (level+1) | c==']' = [c] ++ indentBrackets rest (level-1) | otherwise = [c] ++ indentBrackets rest level 

, 나는 조금이 내려 트림 것 :'. ''++ :''/ *' – user2407038

6

참고 : 당신이해야하는 것은 c는 "atomical는"주위 c는 아무것도하지 않고 괄호이다, 첫째, 지금 형태

a ++ (f b (c)) 

이다 어쨌든.

a ++ (f b c) 

다음, 하스켈에서 처리하는 방법을 여러 인수 기억 을 무두질, 즉

a ++ ((f b) c) 

의 잠시 동안 g = f b를 사용하자 ...

a ++ (g c) 

좋아, g c입니다 간단한 응용 프로그램, 함수/람다 식을 값으로 사용합니다.기능 응용 프로그램은 어떤 중위 연산자보다 더 긴밀하게 결합, 그래서 지금 다시 태닝 브래킷을 제거 다시 f

a ++ (f b) c 

가져

a ++ g c 

와 같은, 그리고 당신은

a ++ f b c 
와 끝까지

또는 예를 들어

[c] ++ indentBrackets rest level 
,

우리는 당신의 전체 코드에 적용 할 경우

더 일반적으로
indentBrackets (c:rest) level 
    | c `elem` "([" = "\n" ++ replicate level ' ' 
         ++ c : indentBrackets rest (level+1) 
    | c `elem` ")]" = c : indentBrackets rest (level-1) 
    | otherwise = c : indentBrackets rest level 
관련 문제