2017-02-11 2 views
1

여러 패턴을 사용하는 Frege의 함수를 정의하는 데 문제가 있습니다. 기본적으로 튜플 목록을 반복하여 매핑을 정의합니다. 나는 다음과 같은 오류 얻을Frege에서 여러 패턴을 정의하는 방법은 무엇입니까?

foo :: a -> [(a, b)] -> b 
foo _ [] = [] --nothing found 
foo bar (baz, zab):foobar 
| bar == baz = zab 
| otherwise = foo bar foobar 

: 나는 다음에 그것을 아래로 단순화했습니다 내가 함수 정의에서 여러 패턴을 사용 할 this 같은 다른 예를 본 적이

E morse.fr:3: redefinition of `foo` introduced line 2 

를, 그래서 내가 뭘 잘못하고 있는지 모르겠다. 왜 여기에 오류가 발생합니까? Frege에 익숙하다 (그리고 하스켈에 새로 온 것). 그래서 내가 놓치고있는 간단한 것이 있을지 모르지만, 나는 이것이 정말로 문제가되어야한다고 생각하지 않는다.

버전 3.24-7.100으로 컴파일 중입니다.

+2

'(baz, zab) : foobar' 패턴 주위에 괄호를 추가해야 할 수도 있습니다. 'foo bar ((baz, zab) : foobar) '와 같은 것. – Alec

답변

2

이것은 하스켈 패밀리의 신규 언어에 영향을주는 순수한 구문 문제입니다. 함수 응용 프로그램이 중위 식보다 우선 순위가 높다는 규칙을 내부화 할 때까지는 시간이 오래 걸리지 않습니다. 기능 응용 프로그램의

  • 복잡한 인수는 괄호가 필요합니다

    이 결과를 가지고 있습니다.

  • 중위 표현식에서 연산자의 양쪽에있는 함수 응용 프로그램에는 괄호가 필요하지 않지만 함수 응용 프로그램의 개별 구성 요소에는 여전히 필요합니다.

는 프레게에서뿐만 아니라, 다음과 같은 규칙이 보유 : 당신이를 적용 할 때, 따라서

data Number = Z | Succ Number 

a + Z  = a 
a + Succ b = Succ a + b 

:

The syntax of function application and infix expressions on the left hand side of a definition is identical to the one on the right hand side as far as lexemes allowed on both sides are concerned. (This holds in Haskell only when @ and ~ are not used.)

이 때문에이 같은 추가 기능을 정의 할 수 있습니다 예를 들어 구문을 보면 : 연산자를 다시 정의 할 것입니다. 당신이 원하는 것을 달성하기 위해, 당신은 따라서를 작성해야합니다 :

foo bar ((baz, zab):foobar) = .... 
-- ^    ^

이 당신이 구축하는 목록으로 foo을 적용 상황에 해당

foo 42 (x:xs) 

당신이 쓰는

foo 42 x:xs 

이 의미는

(foo 42 x):xs 
+0

그렇게 많은 의미가 있습니다. 자세한 답변 해 주셔서 감사합니다! –

관련 문제