简单的Haskell因子函数不编译

时间:2016-10-18 04:16:52

标签: haskell compiler-errors ghci

所以我有这个简单的Haskell函数:

fact :: (Num a) => a -> a
fact 0 = 1
fact n = n * fact (n - 1)

当我尝试用GHCi编译它时,我收到一个错误:

test.hs:2:6: error:
    • Could not deduce (Eq a) arising from the literal ‘0’
      from the context: Num a
        bound by the type signature for:
                   fact :: Num a => a -> a
        at test.hs:1:1-25
      Possible fix:
        add (Eq a) to the context of
          the type signature for:
            fact :: Num a => a -> a
    • In the pattern: 0
      In an equation for ‘fact’: fact 0 = 1
Failed, modules loaded: none.

看,我知道有更好的方法来编写这个功能,但我不在乎。我只想让这个函数编译。我不能这样做。我的印象是,如果某个东西是数字,它必须是Eq a的一个实例,因此编译器对可能修复的建议是错误的。

如何编译此代码?

1 个答案:

答案 0 :(得分:1)

您假设作为Num实例的类型也必须是Eq的实例,这是假的。考虑函数的推断类型:

> fact 0 = 1; fact n = n * fact (n - 1)
> :t fact
fact :: (Num t, Eq t) => t -> t

要成为Num的实例,类型只需要定义以下函数:

  • (+)
  • (*)
  • abs
  • signum
  • fromInteger
  • negate(-)