Haskell Language
확고한 선언
수색…
통사론
- 중절 [정수] 연산
- infixl [정수] 연산
- 삽입자 [정수] 연산
매개 변수
선언 구성 요소 | 의미 |
---|---|
infixr | 연산자는 오른쪽 연관입니다. |
infixl | 연산자는 왼쪽 연관입니다. |
infix | 연산자는 비 연관입니다. |
임의의 숫자 | 연산자의 바인딩 우선 순위 (범위 0 ~ 9, 기본값 9) |
op1, ... , opn | 연산자 |
비고
하스켈은 연산자와 함수가 포함 된 표현식을 구문 분석하기 위해 고정 선언문을 사용하여 괄호가 어디에 있는지 파악합니다. 순서대로
- 기능 응용 프로그램을 괄호로 묶습니다.
- 바인딩 우선 순위를 사용하여 동일한 우선 순위의 사업자가 모두 분리 한 용어 그룹을 묶습니다.
- 이러한 연산자의 연관성을 사용하여이 그룹에 괄호를 추가하는 방법을 찾습니다.
여기서 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 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
-
1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
-
(1 + ((negate 5) * 2)) - (3 * (4 ^ (2 ^ 1)))
Haskell 98 보고서의 4.4.2 절에 대한 자세한 내용.
연관성
infixl
대 infixr
대 infix
는 어느 쪽이 괄호가 그룹화되는지 설명합니다. 예를 들어, 다음과 같은 고정 선언 (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
됩니다.
바인딩 우선 순위
연관 정보에 나오는 번호는 연산자가 적용된 순서를 설명합니다. 항상 0
과 9
사이 여야합니다. 이것은 일반적으로 작업자가 얼마나 긴밀하게 묶는지를 나타냅니다. 예를 들어, 다음과 같은 고정 선언 (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 ??