2017-12-02 3 views
0

그냥 나에게 이상한 것처럼 보였습니다. 역 따옴표는 구문 연산자처럼 작동합니다.구문 연산자로 역 따옴표

applyOp :: Int -> (Int -> Int -> Int) -> Int -> Int 
applyOp x op y = x `op` y 

> applyOp 2 (+) 5 
7 

나는 이것을보고 놀랐다. 나는 항상 백틱은 오퍼레이터에게 실행 중에 바인딩 될 수있는 식별자가 아닌 오퍼레이터 심볼이나 식별자를 둘러싸도록 요구된다는 것을 상상했다. 내가 잘못 생각한거야?

+5

예, 백틱은 구문입니다. 그들은 모든 식별자를 삽입 연산자로 변환합니다. –

+6

패턴 매칭 중에 바인드 된 식별자와 정의를 통해 바인드 된 식별자는 실제로 차이가 없습니다. – chepner

+7

마음을 날려 버리고 싶다면 'apply 1 (+) 2'에서 x (*) y = x * y를 적용하자. –

답변

3

Backticks는 식별자를 삽입 연산자로 바꾸는 구문 설탕입니다. 즉, a `f` b = f a b은 일반적인 다시 쓰기 규칙입니다. 이것은 명확성을 위해 유용하지만 f (a b) (c d)a b `f` c d으로 다시 쓸 수 있기 때문에 너무 많은 대괄호를 피할 수 있습니다.

그러나 이러한 사용과 몇 가지주의 사항이있다,하지만이 제한 다음 backticked 식 식별자해야

  • , 그래서, 그 때문에 참여 1 `mod` 2은 유효하지만 a `zipWith (+)` b이 유효하지 않습니다 기능 응용 프로그램.

  • 영숫자 식별자는 너무 1 `mod` 2이 유효을 backticked 할 수 있지만, 1 `(+)` 2가 잘못되었습니다. 이전 제한 사항을 적용한 것으로 볼 수 있습니다.

  • Backticked 표현은 너무 a + c `f` b는 구문 분석, 우선 순위 (9)가 있고, 왼쪽 연관, 그래서 a `f` b `f` c 그것을 inlcude 것이다 (a `f` b) `f` c로 분석하고, 일반적으로 다른 사업자에 있습니다

에서

* a + (c `f` b)로 이 경우 op은 영숫자 식별자이며 applyOp x op y = op x y과 동일하므로 applyOp x op y = x `op` y이 유효합니다. 바인딩 패턴 일치 식별자에 대한 아니요 제한 사항에 유의하십시오.


*이 표준 서곡 사업자 !!.에 대한 사실이 아니다. 우선 순위 및 수정에 대한 자세한 내용은 The Haskell 98 Report에서 확인할 수 있습니다.

+0

3.2 절은 "연산자는 + 또는 $$와 같은 연산자 기호이거나 동봉 된 일반 식별자이다 예를 들어 접두사 응용 프로그램 op xy를 작성하는 대신 중위 어플 리케이션 x \'op \'y를 쓸 수 있습니다. " 저에게 backticks는 연산자로 파싱되기보다는 식별자의 확장과 같은 것으로 여겨졌습니다. 당신이 말했듯이, 역겨운 표현이 우선합니다. 따라서 파서에 임시 처리가 있어야합니다. 아니?. – RussAbbott

+1

@RussAbbott 네, 그건 내 이해입니다. 우선 순위'infixl 9 '는 * all * 중온 연산자의 기본값이므로, 역 따옴표로 묶인 식별자의 우선 순위입니다. 이것은 파서 레벨이며,'\'(+) \''또는 다른 불법 표현식을 작성할 때 어떤 오류가 발생 하는지를 봄으로써이를 테스트 할 수 있습니다. – AJFarmar

+2

사소한 점 : 코드를'-XHaskell98' (또는 Haskell 2010을 구현하지 않는 비 GHC 컴파일러를 사용하여)로 컴파일하지 않는 한 Haskell 2010 보고서 (GHC에서 사용되는 기본 의미)를 참조해야합니다 - 2010 '98은 대부분 동일하지만 약간의 혼란이있을 수 있습니다. ('98 년에 존재하는 2010 년에 부족한 것은 'n + k'패턴 뿐이지 만, 어쨌든 잘못된 기능으로 널리 간주됩니다.) – user2407038

관련 문제