1

このコードをコンパイルしようとすると

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すると、すべてが大丈夫です。

4

3 に答える 3

7

[i .. j]の省略形ですenumFromTo i jenumFromToは型クラスの一部であり、の一部ではEnumありません(ただし、使用するNum必要があります)。Num+-

だからあなたはそれがa実装Enumするだけでなく実装することを言う必要がありますNum

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

これらの型クラスの両方を実装してDoubleいるため、で動作します。Double

于 2012-07-31T09:44:04.253 に答える
2

動作するため[x .. y]に、結果タイプはインスタンスである必要はまったくありませんNum(たとえば、正常に['A'..'Z']動作します)。インスタンスである必要がありEnumます。Enum型署名に追加するだけです。

両方のインスタンスがあるDoubleので、それはで動作します。Double

于 2012-07-31T09:33:13.373 に答える
1

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

于 2012-07-31T09:32:08.303 に答える