2012-02-19 2 views
4

에 예를 들어, 난 함수를 다음 있어요. (0.5::t)처럼 GHC는 원본 't'에 해당하지 않는 새로운 유형 변수 't0'을 만듭니다.'어디 '기능 유형은 하스켈

b = bar (ct var 0.5) d 

더 나은 솔루션이 있습니까 :

나는 작은 기능이 같은

ct :: v -> v -> v 
ct _ u = u 

및 사용을 쓴거야? 이성을 상실 인수 - -

+0

당신이 가정 해 봅시다'(0.5 :: t)'와하는 컴파일러 옵션이있다처럼 모양을 정확히 무엇을 말할 수 없다 그것은't'를 주변 스코프의't'와 매치시킬 것입니다, 그러나 나는 그것이 무엇인지 잊어 버립니다. –

+1

당신은 아주 적은 정보를 썼습니다. 예를 들어 바의 각각의 바의 타입 시그니처와 foo도 마찬가지입니다. 소문자는 ghc가 유추 될 자리 표시 자임을 이해합니다. 알려진 타입은'Float' 또는'Int'와 같은 대문자로 시작하므로 더 많은 정보를 요구하는 컴파일러에 타입 정보를 거의 전달하지 않습니다. – epsilonhalbe

+0

'ghci'로 파일을로드하려고하면 인터프리터는 여전히 실패합니다 - 덜 엄격하게 기억합니다. 또한 함수의 타입을': t foo'로 알 수 있습니다. – epsilonhalbe

답변

8

당신은 범위에 최상위 서명에서 유형 변수를 가져 ScopedTypeVariables를 사용할 수

{-# LANGUAGE ScopedTypeVariables #-} 

foo :: forall t. Fractional t => t -> f 
foo var = foo' b var 
    where 
    b = bar (0.5 :: t) vect 

귀하의 도우미 함수 ct은 이미 전주곡에,

ct = flip asTypeOf 

so

where 
    b = bar (0.5 `asTypeOf` var) vect 

도 작동합니다.

+0

감사합니다. –

1

ScopedTypeVariables가 없으면 일반적인 해결책은 t 형식을 취하고 t 유형을 반환하는 함수에 b을 다시 쓰는 것입니다. 그러면 해당 t은 일반이며 외부 t과 독립적이며 사용 된 위치를 기반으로 유추 할 수 있습니다. 그러나

등 당신의 foo'bar의 유형을 모른 채, 나는