5

Haskell で 2^8 を計算する 1 つの方法は、

product(replicate 8 2)

このための関数を作成しようとすると、次のように定義されます...

power1 :: Integer →  Integer → Integer
power1 n k | k < 0 = error errorText
power1 n 0 = 1
power1 n k = product(replicate k n)

次のエラーが表示されます。

Couldn't match expected type 'Int' against inferred type 'Integer'

私の推測では、どこかで fromInteger 関数を使用する必要があると思います...どこでどのように使用するのかわかりませんか? それはインターフェースですか、それともfromIntegerとは何ですか?どのように使用すればよいですか?

ありがとう

4

3 に答える 3

11

まず、fromInteger を使用しないでください。fromIntegral を使用します。

レプリケートのタイプを見ると、タイプ エラーがどこにあるかがわかります。

replicate :: Int -> a -> [a]

したがって、型宣言を介して整数であると主張した引数として「k」を指定すると、型エラーが発生します。

これに対するより良いアプローチは、genericReplicate を使用することです。

genericReplicate :: (Integral i) => i -> a -> [a]

それで:

power1 n k = product (genericReplicate k n)
于 2009-11-02T19:40:30.547 に答える
3

エラーメッセージの残りの部分も確認する必要があります。質問に対する正確な答えが示されています。

Couldnt match expected type 'Int' against inferred type 'Integer'
In the first argument of 'replicate', namely 'k'
In the first argument of 'product', namely '(replicate k n)'
In the expression: product (replicate k n)

「レプリケートの最初の引数で」。を追加する場所fromIntegralです。

于 2009-11-03T22:55:32.173 に答える
2

おそらく、より簡単な解決策は、関数の型定義を次のように変更することです。

power1 :: Integer -> Int -> Integer
于 2009-11-02T19:45:27.933 に答える