2013-02-28 49 views
9

我想在我的代码中添加一些本地函数的类型签名。但是,它们的类型涉及匿名的,存在边界的类型变量。由于它们是匿名的,我不知道如何编写类型签名。我怎样才能引用这种类型的变量?引用一个存在型变量

在以下示例中,go的类型为[b] -> Int -> Int,其中b是由模式匹配T (x_shared:xs) g绑定的类型。我可以写什么类型的签名?

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 – 2013-02-28 05:36:26

回答

15

随着ScopedTypeVariables扩展,你可以添加一个类型注解g并介绍类型变量a的范围。

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

然后,你可以写一个go类型签名与a

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

我不知道,你可以在模式中引入类型变量!我猜你每天都会学到一些知道的东西。 – 2013-02-28 05:19:19