質問

Haskellでは2 ^ 8を計算するための一つの方法は、書き込むことである。

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であり、私はそれをどのように使うのか?

おかげ

役に立ちましたか?

解決

まず、fromIntegerを使用することはありません。 fromIntegralを使用します。

型エラーが複製の種類を調べることである。ここで、

あなたが見ることができます:

replicate :: Int -> a -> [a]
あなたはそれはあなたがアサートしまし引数として「K」は型宣言を経由して整数であるGIVとき

ので、我々は、型エラーがあります。

このためのより良いアプローチはgenericReplicateを使用することです

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

それではます:

power1 n k = product (genericReplicate k n)

他のヒント

たぶん簡単な解決策は、に、関数の型定義を変更することです

power1 :: Integer -> Int -> Integer

あなたは、同様のエラーメッセージの残りの部分を見なければならない、それはあなたの質問に正確に答えをあなたに伝えます:

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を追加する場所です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top