2013-02-28 3 views
9

내 코드의 일부 로컬 함수에 형식 시그니처를 추가하고 싶습니다. 그러나, 그들의 유형은 익명의, 실존 적으로 바운드 된 유형 변수를 포함합니다. 그들은 익명이기 때문에 형식 서명을 쓰는 법을 모르겠습니다. 어떻게 이러한 유형 변수를 참조 할 수 있습니까? 다음 예에서 실존 형 변수를 참조하면

, gob 패턴 매치 T (x_shared:xs) g 구속 종류이다 [b] -> Int -> Int를 입력 갖는다. 어떤 형식의 서명을 쓸 수 있습니까?

data T = forall a. T [a] (a -> a -> Int) 

f :: T -> Int 
f (T (x_shared:xs) g) = go xs 0 
    where 
    -- go :: what type? 
    go (x:xs) n = go xs $! n + g x_shared x 
    go []  n = n 
+0

당신이 유용한 mightfind : http://stackoverflow.com/questions/13828602/outer-bound-type-declarations-without-scopedtypevariables –

답변

15

ScopedTypeVariables 확장으로, 당신은 g에 유형 주석을 추가하고 해당 범위에 a 변수 유형을 도입 할 수 있습니다.

f (T (x_shared:xs) (g :: a -> a -> Int)) = go xs 0 

은 그럼 당신은 ago의 유형 서명을 작성할 수 있습니다.

go :: [a] -> Int -> Int 
+3

난 당신이 패턴 형의 변수를 도입 할 수 몰랐어요! 당신은 매일 알고있는 것을 배울 것입니다. –

관련 문제