无法从算术序列`(x - n + 1)... x'推断出(枚举a)

时间:2012-07-31 09:25:08

标签: haskell syntax

当我尝试编译这段代码时

prod [] = 1
prod (x:xs) = x * prod xs

ff :: (Num a) => a -> a -> a
ff x n = prod [(x - n + 1) .. x]

我收到以下错误:

a.hs:5:15:
    Could not deduce (Enum a)
     arising from the arithmetic sequence `(x - n + 1) .. x'
    from the context (Num a)
      bound by the type signature for ff :: Num a => a -> a -> a
      at a.hs:5:1-32
    Possible fix:
      add (Enum a) to the context of
        the type signature for ff :: Num a => a -> a -> a
    In the first argument of `prod', namely `[(x - n + 1) .. x]'
    In the expression: prod [(x - n + 1) .. x]
    In an equation for `ff': ff x n = prod [(x - n + 1) .. x]

这段代码有什么问题?当我用Double代替一切都没问题时。

3 个答案:

答案 0 :(得分:7)

[i .. j]enumFromTo i j的简写。 enumFromToEnum类型类的一部分,而不是Num的一部分(您仍然需要Num才能使用+-

所以你需要说a实现Enum以及实施Num

ff :: (Num a, Enum a) => a -> a -> a
ff x n = prod [(x - n + 1) .. x]

它与Double一起使用,因为Double实现了这两个类型类。

答案 1 :(得分:2)

为了使[x .. y]有效,结果类型根本不需要是Num个实例(例如,['A'..'Z']工作正常)。它必须是Enum实例。只需将Enum添加到类型签名。

它适用于Double,因为Double有两个实例。

答案 2 :(得分:1)

ff :: (Enum a, Num a) => a -> a -> a
ff x n = prod [(x - n + 1) .. x]