我想在我的代码中为一些本地函数添加类型签名。但是,它们的类型涉及匿名的、存在绑定(bind)的类型变量。由于它们是匿名的,我不知道如何编写类型签名。我怎样才能引用这样的类型变量?
在以下示例中,go
有类型 [b] -> Int -> Int
, 其中 b
是由模式匹配 T (x_shared:xs) g
绑定(bind)的类型.我可以为它写什么类型的签名?
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
最佳答案
与 ScopedTypeVariables
扩展名,您可以在 g
中添加类型注释并引入类型变量 a
到范围。
f (T (x_shared:xs) (g :: a -> a -> Int)) = go xs 0
然后你可以为
go
写一个类型签名。与 a
.go :: [a] -> Int -> Int
关于haskell - 引用存在类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15126993/