haskell - 引用存在类型变量

标签 haskell existential-type

我想在我的代码中为一些本地函数添加类型签名。但是,它们的类型涉及匿名的、存在绑定(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/

相关文章:

haskell - 第二个最近的列表项 Haskell

scala - 不符合 lambda 类型的种类

haskell - Haskell/Elm 中的语法

haskell - 在 Snap 中使用路线和 html (Heist)

haskell - 资源耗尽(打开的文件太多)

haskell - 打印递归循环的调用堆栈

scala - 在 Scala 泛型语法中放置 "forSome"子句的意义是什么?

scala - 什么是以及何时使用 Scala 的 forSome 关键字?

scala - 将变量从 Scala 中的存在类型 TypeCast 转换为运行时类型

scala - 为什么除非添加显式类型参数,否则以下 Scala 代码无法编译?