2013-02-28 21 views
9

Kodumdaki bazı yerel işlevlere tip imzaları eklemek istiyorum. Ancak, türleri anonim, varoluşsal olarak bağlı tip değişkenleri içerir. Anonim olduklarından, nasıl tip imza yazılacağını bilmiyorum. Bu tür değişkenlere nasıl başvurabilirim? Aşağıdaki örnekte Varolansal bir değişkene atıfta bulunma

, go b model maçı T (x_shared:xs) g bağlı türüdür [b] -> Int -> Int, tip vardır. Bunun için ne tür bir imza yazabilirim?

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

Bu kullanışlı mightfind: http://stackoverflow.com/questions/13828602/outer-bound-type-declarations-without-scopedtypevariables –

cevap

15

ScopedTypeVariables uzantısı ile, g bir tür ek açıklama eklemek ve kapsamı a değişken türünü tanıtabilirsiniz.

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

Sonra a ile go için bir tür imza yazabilir.

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

Sana desenlerde tip değişkenleri tanıtmak bilmiyordum! Her gün bildiğiniz bir şey öğreniyorsunuz sanırım. –

İlgili konular