Ошибка типа функции 'floor' в Haskell - PullRequest
2 голосов
/ 07 декабря 2010

У меня есть функция, принимающая 2 Ints n, x и вычисляющая этаж (log n / log x).Здесь n и x оба очень ограничены, поэтому мне достаточно Int.

func :: Int -> Int -> Int <br> 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))

Как я могупройти через это?

Ответы [ 2 ]

12 голосов
/ 07 декабря 2010

Выражение log . fromIntegral n эквивалентно log . (fromIntegral n), а не (log . fromIntegral) n, что, вероятно, то, что вы хотели. Просто log (fromIntegral n), вероятно, более читабельно.

Для общего назидания, когда в сообщении об ошибке указано No instance for (RealFrac (a -> b)), оно говорит вам, что не может понять, как использовать функцию в качестве дробного числа, что она пытается сделать, потому что вы применяете композицию функции (.) для результат fromIntegral n. Это немного глупо в этом случае.

4 голосов
/ 07 декабря 2010

Попробуйте это:

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