Haskell은 어떤 타입 클래스 인스턴스를 의미하는지 어떻게 알 수 있습니까?

StackOverflow https://stackoverflow.com/questions/817466

문제

이 질문은 The Excellent에서 새로운 장을 읽는 동안 적용 기능에 대한 Haskell을 읽는 동안 발생했습니다.

적용 타입 클래스는 인스턴스에 대한 정의의 일부로 다음과 같습니다.

pure = Just

GHCI로 가서 IMPORM Control. Applicative를 사용하는 경우 :

pure (3+)

나는 아무것도 얻지 못한다 (이해가된다). 그러나 표현의 일부에서 사용하면 다음과 같습니다.

pure (3+) <*> Just 4

나는 단지 7을 얻는다. 나는 또한 놀라운 일이 아니라고 생각한다. 그러나 나는 타입 클래스가 어떻게 작동하는지에 대해 필수적인 것을 놓친 것 같다. pure 여기.

내 혼란이 이해되면 누구나 무슨 일이 일어나고 있는지 자세히 설명 할 수 있습니까?

도움이 되었습니까?

해결책

그것은 단지 유형의 추론입니다. 그만큼 (<*>) 연산자는 동일한 것을 사용하기 위해 두 인수를 모두 요구합니다 Applicative 사례. 오른쪽은 a입니다 Maybe, 왼쪽은 a Maybe 또한. 그래서 여기에서 어떤 인스턴스가 사용되는지 알아냅니다. 입력하여 통역사의 모든 표현 유형을 볼 수 있습니다. :t expression, 그리고 아마도 각 하위 표현을 통과하고 추론 된 유형을 보면 진행되는 일에 대한 더 나은 그림을 얻을 수 있습니다.

다른 팁

컴파일러가 주홍로 유형을 살펴볼 가치가 있습니다. pure (3+):

Prelude Control.Applicative> :t pure (3+)
pure (3+) :: (Num a, Applicative f) => f (a -> a)

이 용어의 유형은 과부하이며 숫자 클래스 및 응용 클래스에 대한 결정은 나중에 지연됩니다. 그러나 예를 들어 주석으로 특정 유형을 강요 할 수 있습니다.

*Showfun Control.Applicative> pure (3+) :: Maybe (Double -> Double)
Just <function>

(이것은 작동하기 때문에 Showfun 함수 값을 다음과 같이 인쇄하는 인스턴스 선언이 있습니다. <function>.)

컴파일러가 결정을 내릴 수있는 충분한 정보를 누적했을 때의 문제 일뿐입니다.

NewACCT의 답변을 약간 확장하려면 실제 유형을 유추 할 정보가 충분하지 않으면 컴파일러는 (경우에 따라) 기본 유형을 선택하려고 시도 할 수 있으며, 해당 유형 제한 조건을 충족시키는 것보다 제한 될 수 있습니다. 이 경우, 추론 된 유형은 NUM => n의 결정하기 어려운 인스턴스에 대해 io (n-> n)입니다. 그런 다음 GHCI는이를 평가하고 눈에 띄는 효과없이 반환 값을 버립니다.

여기에 흥미로운 것이 있습니다 따라서 유형 추론에 실. Haskell은 구체적이지는 않지만 기능 언어의 유형 추론에 대해 읽을 수있는 좋은 링크와 내용이 많이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top