2009-05-03 5 views
4

이 질문은 훌륭한 챕터에서 새로운 챕터를 읽는 동안 발생했습니다.Haskell은 어떤 typeclass 인스턴스를 의미하는지 어떻게 알 수 있습니까?

실용적 typeclass가있는 어쩌면 인스턴스에 대한 정의의 일부로서 :

pure = Just 

난 그냥 GHCi 및 가져 오기 Control.Applicative에 가서 할 경우

pure (3+) 

I 돈 그냥 아무것도 얻지 못한다. 나는 표현의 일부에서 사용한다면 :

pure (3+) <*> Just 4 

나는 그것은 또한 놀라운 일이 아니다 추측 7. 그냥 얻을,하지만 난 typeclasses 작동 방법에 대한 중요한 뭔가가있어, 나는이 있다고 생각 pure 여기에 전화와 모호성.

혼란 스러우면 누구나 자세히 설명 할 수 있습니까?

답변

6

단지 형식 유추 일뿐입니다. (<*>) 연산자는 동일한 Applicative 인스턴스를 사용하려면 두 인수가 모두 필요합니다. 오른쪽은 Maybe이므로 왼쪽은 Maybe이어야합니다. 그래서 여기에서 어떤 인스턴스가 사용되는지 파악합니다. 당신은 :t expression을 입력하여 인터프리터의 표현식의 유형을 볼 수 있습니다. 그리고 각 하위 표현식을 통해 유추 된 유형을 살펴본 후 더 자세한 정보를 얻을 수 있습니다.

+0

아, 그렇다면 컴파일러는 "흠,이 인수의 형식이 모호하기 때문에 다음 인수의 형식을 확인하고 다시 돌아갑니다"와 같은 작업을 수행합니까? –

+8

타입 추론은 꽤 복잡하지만 한 단계에서 발생하지 않는다는 것을 알고 있어야합니다. 타입 추론 기는 보통 한 단계에서 정보를 수집하고, 나중에 단계에서 좀 더 많은 정보를 수집합니다. 따라서 왼쪽에서 오른쪽으로 한 번에 모든 것에 올바른 유형을 추론하지는 않습니다.이 경우'순수'는'(Applicative a1) => a1 (Int -> Int)'이고,'a1'은 형식화 된 형 변수 일 뿐이며, 타입 추론 중에 나중 단계에서 'a1'은'어쩌면'이라고 결론을 내릴 것이고, 그러면'a1'을'어쩌면'으로 대체 할 것입니다. –

+0

고맙습니다 - 그게 아주 도움이됩니다! –

2

newacct의 답변에 약간의 확장을하기 위해 실제 유형을 추론 할 정보가 충분하지 않은 경우 컴파일러에서 유형 제약 조건을 충족시키는 유형으로 제한되는 기본 유형을 선택하려고 시도 할 수 있습니다 (경우에 따라). 문제. 이 경우 유추 된 유형은 Num => n의 결정하기 어려운 일부 인스턴스에 대한 IO (n -> n)입니다. 그런 다음 GHCi는이를 평가하고 가시적 인 효과없이 반환 값을 버립니다.

3

그것은 컴파일러가 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> 같은 함수 값을 출력 인스턴스 선언이 있기 때문에이 작동합니다.)

그것은 때 단지 질문 컴파일러는 결정을 내리기에 충분한 정보를 축적했다.

+0

호기심에서 벗어나 기존 패키지에있는'Showfun' 모듈입니까 아니면 직접 작성한 것입니까? 구현은 충분히 직설적이다 :'instance Show (a -> b) where; show _ = "" –

+0

필자는 Showfun을 직접 작성하여'Just '를 사용하여 인쇄 할 예제'pure (3+)'를 얻을 수있었습니다. –

+0

ShowFunctions는 이제 QuickCheck에 있습니다. – porges

1

흥미로운 내용은 SO thread on type inference입니다. 하스켈에 특화된 것은 아니지만 기능적 언어로 형식 유추에 관해 읽을 수있는 좋은 링크와 자료가 많이 있습니다.

관련 문제