[haskell] (-) 겉보기에는 두 가지 유형이 어떻게 보일 수 있습니까?

내가 입력 할 때 ghci에서

:t (-)

의 유형을 알아 내기 위해 (-), 그것은 반환

(-) :: Num a => a -> a -> a

내가 쓸 때, -1하스켈 반환 것을 암시하는 것 같다 숫자, (-)유형이다 Num a => a -> a. (-)겉보기에는 두 가지 유형이 어떻게 될 수 있습니까?



답변

이것은 언어의 디자인 결정이었습니다. -1는 숫자이지만이 컨텍스트에서의 사용법 은 함수와 관련(-)없습니다 . Ackdari가 답변에서 언급 했듯이이 사용법은 기능과 관련이 있습니다 negate. 이 기능을 사용하려면 몇 가지 타협이 있습니다.

  1. 올바른 (-)조작자를 사용할 수 없습니다 . 해결 방법으로 Haskell은이 subtract기능을 제공합니다 .

  2. 할당의 시작이 아닌 경우 (예 : =또는 바로 뒤에 ->) 괄호없이 음수를 쓸 수 없습니다 . 구문 분석 오류가 발생합니다.

    let x = 8 * -1

    대신 다음과 같이 작성해야합니다.

    let x = 8 * (-1)

    그러나 이것은 괜찮습니다.

    let x = -1 * 8

이것들은 언어 디자이너들에게 합리적인 절충안으로 여겨졌다.


답변

대답은 이미 haskell-wiki 에서 설명되어 있습니다.

단항 마이너스는 Prelude 기능을위한 구문 설탕입니다 negate

따라서 함수 (-)는 항상 a - b함수이며 let x = -y컴파일러 와 같은 코드를 작성
하면로 변환됩니다 let x = negate y.


답변

단항 빼기는 하스켈에서 특별합니다. 보고서의 섹션 3.4에 명시된 바와 같이 :

특수 형식 은 Haskell에서 유일한 접두사 연산자 인 접두사 부정을 나타내며의 구문입니다 . 이항 연산자는 반드시 Prelude 의 정의를 참조 할 필요는 없습니다 . 모듈 시스템에 의해 리바운드 될 수 있습니다. 단, 단항 은 항상 Prelude에 정의 된 기능을 참조합니다 . 연산자 의 로컬 의미 와 단항 부정 사이에는 관련이 없습니다 .-enegate (e)---negate-


답변