수색…


통사론

  1. 중절 [정수] 연산
  2. infixl [정수] 연산
  3. 삽입자 [정수] 연산

매개 변수

선언 구성 요소 의미
infixr 연산자는 오른쪽 연관입니다.
infixl 연산자는 왼쪽 연관입니다.
infix 연산자는 비 연관입니다.
임의의 숫자 연산자의 바인딩 우선 순위 (범위 0 ~ 9, 기본값 9)
op1, ... , opn 연산자

비고

하스켈은 연산자와 함수가 포함 된 표현식을 구문 분석하기 위해 고정 선언문을 사용하여 괄호가 어디에 있는지 파악합니다. 순서대로

  1. 기능 응용 프로그램을 괄호로 묶습니다.
  2. 바인딩 우선 순위를 사용하여 동일한 우선 순위의 사업자가 모두 분리 한 용어 그룹을 묶습니다.
  3. 이러한 연산자의 연관성을 사용하여이 그룹에 괄호를 추가하는 방법을 찾습니다.

여기서 2 단계의 주어진 그룹의 연산자는 모두 같은 연관성을 가져야한다고 가정합니다. 사실 하스켈은이 조건이 충족되지 않는 프로그램을 거부합니다.

위의 알고리즘의 예로서, 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1 괄호를 추가하는 과정을 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1 있습니다.

infixl 6 +
infixl 6 -
infixl 7 *
infixr 8 ^
  1. 1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
  2. 1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
  3. (1 + ((negate 5) * 2)) - (3 * (4 ^ (2 ^ 1)))

Haskell 98 보고서의 4.4.2 절에 대한 자세한 내용.

연관성

infixlinfixrinfix 는 어느 쪽이 괄호가 그룹화되는지 설명합니다. 예를 들어, 다음과 같은 고정 선언 (base)

infixl 6 -
infixr 5 :
infix  4 ==

infixl 것을 우리에게 알려줍니다 - 연관성을 떠난 것을 의미하는 1 - 2 - 3 - 4 로 해석됩니다

((1 - 2) - 3) - 4

infixr 는 다음과 같이 알려줍니다 : 1 : 2 : 3 : [] 이 (가) 파싱됨을 의미하는 올바른 연관성을 가짐

1 : (2 : (3 : []))

infix== 가 괄호를 포함하지 않고는 사용할 수 없다는 것을 말해줍니다. 즉, True == False == True 는 구문 오류입니다. 반면에 True == (False == True) 또는 (True == False) == True 이면됩니다.

명시 적 선언이없는 연산자는 infixl 9 됩니다.

바인딩 우선 순위

연관 정보에 나오는 번호는 연산자가 적용된 순서를 설명합니다. 항상 09 사이 여야합니다. 이것은 일반적으로 작업자가 얼마나 긴밀하게 묶는지를 나타냅니다. 예를 들어, 다음과 같은 고정 선언 (base)

infixl 6 +
infixl 7 *

*+ 보다 바인딩 우선 순위가 높기 때문에 1 * 2 + 3 과 같이 읽습니다.

(1 * 2) + 3

간단히 말해, 숫자가 높을수록 운영자는 양쪽에있는 괄호를 "당깁니다".

비고

  • 함수 응용 프로그램은 항상 연산자보다 높은 수준으로 바인딩되므로 fx `op` gy 는 ( fx `op` gy (fx) op (gy) 연산자 `op` 와 고정 선언이 무엇이든 상관없이 해석되어야합니다.

  • 고정 우선 순위에서 바인딩 우선 순위가 생략 된 경우 (예 : infixl *!? ) 기본값은 9 입니다.

예제 선언

  • infixr 5 ++
  • infixl 4 <*>, <*, *>, <**>
  • infixl 8 `shift`, `rotate`, `shiftL`, `shiftR`, `rotateL`, `rotateR`
  • infix 4 ==, /=, <, <=, >=, >
  • infix ??


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow