【问题标题】:Haskell function signature and "Could not deduce" compiler errorHaskell 函数签名和“无法推断”编译器错误
【发布时间】:2011-03-28 08:33:52
【问题描述】:

我正在编写一个使用 Data.Vector 的 Haskell 库。我成功编写了库函数,但我不知道如何为其添加签名。下面是一个说明问题的简单示例:

将合格的 Data.Vector.Generic 导入为 V -- 压缩两个向量并将第一个元素作为元组返回 测试 :: (V.Vector v a, Fractional a) => v a -> v a -> (a, a) 测试 a b = (V.zip a b) V.! 0

此代码导致以下编译错误:

无法推断(V.Vector v (a, a)) 从上下文 (V.Vector v a, Fractional a) 由在 MyLib.hs:7:12-20 使用“V.zip”引起 可能的修复: 将 (V.Vector v (a, a)) 添加到 `test' 的类型签名 或为 (V.Vector v (a, a)) 添加实例声明 在 `(V.!)' 的第一个参数中,即 `(V.zip a b)' 在表达式中: (V.zip a b) V.! 0 在 `test' 的定义中: test a b = (V.zip a b) V.! 0

如果我注释掉test 函数的签名,代码就会被编译。这里的正确签名是什么?

我使用的是 GHC 6.12.3,向量库 0.7.0.1。

谢谢。

【问题讨论】:

    标签: haskell signature


    【解决方案1】:

    ghci 说:

    Prelude Data.Vector.Generic> :t \a b -> (Data.Vector.Generic.zip a b) Data.Vector.Generic.! 0
    \a b -> (Data.Vector.Generic.zip a b) Data.Vector.Generic.! 0
      :: (Vector v a, Vector v b, Vector v (a, b)) =>
         v a -> v b -> (a, b)
    

    与你的情况相匹配,签名应该是

    test :: (V.Vector v a, Fractional a, V.Vector v (a, a)) => v a -> v a -> (a, a)
    

    (哦,你需要 FlexibleContexts)

    【讨论】:

    • 谢谢。我没有解决我当前的问题,您向我展示了将来解决它的方法。通过 ghci 很容易知道函数的类型!
    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2010-10-17
    • 2020-01-21
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多