【问题标题】:Referring to an existential type variable引用存在类型变量
【发布时间】:2013-02-28 12:17:29
【问题描述】:

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

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

【问题讨论】:

标签: haskell existential-type


【解决方案1】:

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

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

然后你可以用ago写一个类型签名。

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

【讨论】:

  • 我不知道你可以在模式中引入类型变量!我猜你每天都会学到一些已知的东西。
猜你喜欢
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
相关资源
最近更新 更多