2014-04-16 2 views
4

은 가정하자 나는 형에게 정의 내가 A IntA Double 다른, 불평등 한 종류이기 때문에 (B :: A Int) == (B :: A Double)이 유형 체킹하지 않는, 그래서 (==) :: Eq a => a -> a -> Boolhaskell에서 매개 변수가없는 ADT의 생성자 유형은 무엇입니까?

을 적용 할 수 없습니다하지만 내가 무엇을 ghci 요청할 수 있다는 사실을 알고

data A a = A a | B deriving Show 

show B이고 ghci는 문자열 "B"라고 말합니다. 그 유형은 정확히 B입니까? 이건 A Int입니까? 왜? 그리고 ghci가 B의 유형이 모호하다는 것에 불평하지 않는 이유는 무엇이든지 a 일 경우 A a 일 수 있기 때문입니다.

나는 비슷하게 ghci에게 show (B==B)을 물어볼 수 있습니다. "True"라고 말하면, 그 유형은 모두 B입니까?

나는 :t B와 B의 종류, 그것은 B :: A a를 인쇄 ghci 물어 보면,하지만이 두 가지 예에서 혼란 스러워요 않는 한 모든 유형의 매개 변수없이 일부 특정 유형이어야합니다보다. 그러면 B의 유형이 B==B 인 것을 어떻게 알 수 있습니까?

조금 혼란 스럽습니다. 이것이 어디에서 설명 되었습니까?

답변

9

동작의 이유는 ExtendedDefaultRules이라고하는 ghc 확장입니다. 링크에서 인용

: 사용자가 유형을 지정해야하는 그러나

, 그것은 귀찮은, 그래서 GHCi 하스켈의 타입 디폴트 규칙합니다 ( 하스켈 2010 보고서의 섹션 4.3.4 확장) 다음과 같습니다. 표준 규칙 제약 그룹 각각 소요 (C1 A를, C2는, ...을 CN a) 각 입력 변수 A에 대한, 그리고 디폴트 타입 변수

  1. Type 변수 A는 다른 나타나는 경우 제약
  2. 모든 클래스 Ci가 표준입니다.
  3. Ci 클래스 중 적어도 하나는 숫자입니다. -XExtendedDefaultRules 플래그가 주어진 경우 GHCi 프롬프트에서

, 또는 GHC으로, 다음과 같은 추가 차이점이 적용됩니다 위의

  • 규칙 2를 따라서 완화된다 클래스의 모든 CI는 하나의 있습니다 - 매개 변수 유형 클래스.
  • 위의 규칙 3이 완화되었습니다. Ci 클래스 중 하나 이상이 숫자이거나 Show, Eq 또는 Ord입니다. 단위 유형()은 유형 지정을 수행 할 때 시도되는 유형 목록의 시작 부분에 추가됩니다.

은 그래서 이러한 규칙에 따라, B == B 또는 show B에, ()a을 위해 선택됩니다.

또한하여 GHCi 프롬프트에서 다음을 수행하여이를 테스트 할 수 있습니다

예상 ambiguous type variable a 오류가 발생
:set -XNoExtendedDefaultRules 
data Foo a = A a | B deriving Eq 
B == B 

.

+0

대단히 감사합니다. 정확히 알고 싶습니다. – Kirill

관련 문제