2010-12-07 11 views
2

私は2つのInts n、xを受け入れ、floor(log n/log x)を計算する関数を持っています。ここでnとxはどちらも非常に限られているので、Intは私のために十分です。Haskellで関数 'floor'の型エラー

func :: Int -> Int -> Int
func n x = floor (log . fromIntegral n/(log . fromIntegral x))

が、ここでエラーがGHCiの中で来る:

No instance for (RealFrac (a -> b)) 
    arising from a use of `floor' at p5_evenly_divide.hs:20:11-63 
Possible fix: add an instance declaration for (RealFrac (a -> b)) 
In the expression: 
    floor (log . fromIntegral n/(log . fromIntegral x)) 
In the definition of `func': 
    func n x = floor (log . fromIntegral n/(log . fromIntegral x)) 

は、どのように私はこれを介して取得することができますか?

答えて

12

log . fromIntegral nは、log . (fromIntegral n)と等しく、(log . fromIntegral) nではありません。これはおそらくあなたが望むものです。しかし、おそらくlog (fromIntegral n)は読みやすくなります。エラーメッセージは、それはそれはあなたが結果に関数合成(.)を適用しているので、何をしようとしている小数、としての機能を使用する方法を見つけ出すことはできませんあなたを語っていますNo instance for (RealFrac (a -> b))言う一般的な啓発のために

fromIntegral n。この場合、少し鈍いです。

+0

私はあなたが両方の問題を説明する方法と、それを解決する方法を好みます。それは本当に役に立ちます。 – Chuck

+0

ありがとう、それは動作します。 –

+0

私はRealFracで 'floor'を使うべきだというエラーメッセージがあると思っていたので、間違った方向に取り組んでいました。 –

4

はこれを試してみてください:

func :: Int -> Int -> Int 
func n x = floor (k n/k x) where 
    k = log . fromIntegral