参考存在类型变量

时间:2013-02-28 03:38:30

标签: haskell existential-type

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

在以下示例中,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

1 个答案:

答案 0 :(得分:15)

使用ScopedTypeVariables扩展名,您可以向g添加类型注释,并将类型变量a引入范围。

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

然后,您可以使用goa写一个类型签名。

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