2010-12-07 5 views
2

J'ai une fonction acceptant 2 Ints n, x, et calcule floor (log n/log x). Ici n et x sont tous les deux très limités donc Int est suffisant pour moi.Erreur de type de la fonction 'floor' dans Haskell

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

Mais voici l'erreur dans 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)) 

Comment puis-je passer à travers cela?

Répondre

12

L'expression log . fromIntegral n est équivalente à log . (fromIntegral n), et non (log . fromIntegral) n, ce qui est probablement ce que vous vouliez. Juste log (fromIntegral n) est probablement plus lisible, cependant.

les édifie général, lorsque le message d'erreur indique No instance for (RealFrac (a -> b)) il vous dit qu'il ne peut pas comprendre comment utiliser une fonction comme un nombre fractionnaire, qu'il essaie de faire parce que vous appliquez la composition de la fonction (.) au résultat de fromIntegral n. C'est un peu obtus dans ce cas.

+0

J'aime la façon dont vous explique à la fois le problème et comment le dépanner. C'est vraiment utile. – Chuck

+0

merci, ça fonctionne. –

+0

Je pensais que le message d'erreur disait 'floor' devrait être utilisé sur un RealFrac, donc j'ai continué à attaquer dans la mauvaise direction. –

4

Essayez ceci:

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