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)
然后你可以为go
with 写一个类型签名a
.
go :: [a] -> Int -> Int
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
178 次 |
最近记录: |