2016-07-12 11 views

答えて

2

使用^

two i = 2^i 

そしてインテグラル型に戻って結果をキャストするための必要はありません。一方

(**) :: Floating a => a -> a -> a 

toInteger本質的に一体化された入力を必要とする:

6

(**)関数シグネチャに基づいて、浮動小数点入力を必要と

toInteger :: Integral a => a -> Integer 

したがって、次の2つの調整ができませんあなたがそれを使う方法。とにかく整数入力を期待しているように見えるので、それは、あなたがそうのように、代わりに(^)を使用して検討するかもしれない、と述べた:@leftaroundaboutが正しくコメントで指摘し

two :: Integer -> Integer 
two i = 2^i 

として、(^)iの負の値のために失敗します。これは、値をチェックし、別の方法で処理することによって解決することができ、このような何か:ので、あなたの「この...

two :: Integer -> Integer 
two i = toInteger(2 ** i) 

...は動作しません

two :: Integer -> Integer 
two i = if i > 0 then 2^i else floor (2 ** fromIntegral i) 
+1

注意しなければならないのは、 '^'は非負の指数にしか作用しないということです。 'floor(2 ** fromIntegral i)'のようにゼロへの丸めが必要な場合は、負の 'i'を与えます。これは余分な節で処理する必要があります。 – leftaroundabout

+0

@leftaroundaboutありがとうございました。私はそれを私の答えに加えてもいいですか? –

+0

もちろん、そうではありません。 – leftaroundabout

0

理由がありますiが整数であることを宣言しまして、私たちは(**) ...

Prelude> :t (**) 
(**) :: Floating a => a -> a -> a 

の種類を見れば...そのすべての引数は同じタイプのものであり、その型がTのインスタンスである必要があります彼はFloatingタイプクラスです。 IntegerFloatingのインスタンスではありません。これは「浮動整数」の意味ではありません。

最も簡単な解決策は、ErikRが示唆するように^を使用することです。それは整数を整数に上げる。

(^) :: (Integral b, Num a) => a -> b -> a 

**をもう少し学びたい場合は、お読みください。


したがって、整数をFloatingのインスタンスであるタイプに変換する必要があります。 fromIntegralでこれを行うことができます。これを行うと、さまざまなタイプがあいまいであるというエラーメッセージが表示されます。これらは最初のメッセージほど明瞭ではありませんが、問題はtoIntegerの使用です。このタイプを見れば明らかになります。

Prelude> :t toInteger 
toInteger :: Integral a => a -> Integer 

Integral、ではない私たちはtoInteger**の結果を渡している、そしてそれはFloatingあるので、toIntegerは間違っ機能です。 roundが良い選択です。

two :: Integer -> Integer 
two i = round(2 ** fromIntegral(i)) 

これで機能します。

関連する問題