2012-04-24 8 views
4

私は新しい機能の1つにいくつか問題があります。それはfromIntegral関数です。ハスケルを浮動小数点に変換する

基本的に私は2つのIntの引数に取ると数の割合を返す必要がありますが、私は自分のコードを実行すると、それは私にこのエラーを与え続け:

コード:

percent :: Int -> Int -> Float 
percent x y = 100 * (a `div` b) 
where a = fromIntegral x :: Float 
     b = fromIntegral y :: Float 

エラー:

No instance for (Integral Float) 
arising from a use of `div' 
Possible fix: add an instance declaration for (Integral Float) 
In the second argument of `(*)', namely `(a `div` b)' 
In the expression: 100 * (a `div` b) 
In an equation for `percent': 
    percent x y 
     = 100 * (a `div` b) 
     where 
      a = fromIntegral x :: Float 
      b = fromIntegral y :: Float 

私は'98 Haskellのプレリュードを読んで、それがfromIntと呼ばれる、このような機能があると言うが、それは私がこれを行っていたが、それはまだ働いていない働いたことはありません。助けて! divのタイプで

+1

私は98のレポートがfromIntがあると主張疑います。 – augustss

答えて

13

ルック:

div :: Integral a => a -> a -> a 

あなたはFloatへのご入力を変換してからdivを使用することはできません。

使用(/)代わり:

(/) :: Fractional a => a -> a -> a 

次のコードは動作します:

percent :: Int -> Int -> Float 
percent x y = 100 * (a/b) 
    where a = fromIntegral x :: Float 
     b = fromIntegral y :: Float 
+0

ああ、頭のための歓声、私は 'div'を使用しているすべての時間と代替を見て忘れてしまった!私の悪い、もう一度ありがとう! –

+1

簡潔にするために、 ':: Float'型を強制する必要はありません – rotskoff

+0

' Data.Function.on'を使って 'fromIntegral'の'%xy = 100 *((/) 'バックティックで) – Landei

関連する問題