2013-02-28 24 views
9

Chciałbym dodać sygnatury typu do niektórych funkcji lokalnych w moim kodzie. Jednak ich typy obejmują anonimowe, egzystencjalnie związane zmienne typu. Ponieważ są anonimowe, nie wiem, jak napisać podpis typu. Jak mogę się odwoływać do takich zmiennych typu?Odwołując się do zmiennej typu egzystencjalnego

W poniższym przykładzie go ma typ [b] -> Int -> Int, gdzie b jest typem powiązanym przez wzorzec dopasowania T (x_shared:xs) g. Jakiego rodzaju podpisu mogę na niego napisać?

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

Ty mightfind to przydatne: http://stackoverflow.com/questions/13828602/outer-bound-type-declarations-without-scopedtypevariables –

Odpowiedz

15

Z ScopedTypeVariables rozszerzenia, można dodać typ adnotacji do g i wprowadzić typ zmiennej a zakresu.

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

Następnie można zapisać podpis typu dla go z a.

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

ja nie wiedziałem, że można wprowadzić w zmiennych typu wzorów! Nauczysz się, że wiesz coś, co każdego dnia. –