2014-10-31 16 views
4

하스켈을 배우기 시작했는데, 일반적으로 훌륭했지만, 타입 클래스 시스템의 몇몇 특수성은 수치 중심 프로젝트에서 많은 좌절을 불러 왔습니다. 내가 ghci를 열고 추가의 종류를 확인하는 경우 구체적인 예를 들어, 내가 얻을 :하스켈 타입 클래스 혼란

Prelude> :t (+) 
(+) :: Num a => a -> a -> a 

추가는 Num은 가장 일반적인 유형의 클래스, 등, 그래서 모든 것이 의미가 있습니다, 슈퍼 제네릭이다. 그러나 일부 기능을 추가로 선언 한 다음 의 유형을 확인하면 기능을 사용하면 유형 클래스가 Integer으로 축소됩니다!

Prelude> let add = (+) 
Prelude> :t add 
add :: Integer -> Integer -> Integer 

그래서 ... 무슨 일 이니?

답변

5

당신은 두려워 진 단일 동형 제약에 부딪혔습니다. 이를 비활성화하고 일반 기능을 사용할 수 있습니다.

Prelude> let x = (+) 
Prelude> :t x 
x :: Integer -> Integer -> Integer 
Prelude> :set -XNoMonomorphismRestriction 
Prelude> let y = (+) 
Prelude> :t y 
y :: Num a => a -> a -> a 

단조 제한은 유형을 단일 (모노) 콘크리트 조각으로 제한한다는 개념입니다. 확장자는 NoMonomorphismRestriction이며 사용 중지 할 수 있습니다.