参考存在类型变量

Hea*_*ink 9 haskell existential-type

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

在以下示例中,go具有type [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
Run Code Online (Sandbox Code Playgroud)

sna*_*nak 15

通过ScopedTypeVariables扩展,您可以向范围添加类型注释g并将类型变量引入a范围.

f (T (x_shared:xs) (g :: a -> a -> Int)) = go xs 0
Run Code Online (Sandbox Code Playgroud)

然后你可以为gowith 写一个类型签名a.

go :: [a] -> Int -> Int
Run Code Online (Sandbox Code Playgroud)

  • 我不知道你可以在模式中引入类型变量!我想,你每天都会学到一些知识. (3认同)