Ошибка типа Haskell, что не так? - PullRequest
0 голосов
/ 06 октября 2011

Я использую объятия для компиляции простой функции Haskell, вычисляющей количество перестановок. Я хотел бы вернуть целое число, но мне нужно работать с плавающей точкой. Я пытался вычислить ответ как число с плавающей запятой, а затем обрезать его, но по какой-то причине это не сработало.

Это функция:

choose :: Float -> Float -> Integer
 choose n r = truncate (chooseF (n r))
    where
        chooseF::Float->Float->Float
        chooseF n r | n==r = 1
                        | otherwise =  n / (n-r) * chooseF(n-1) r

Это ошибка (строка 35 - вторая строка функции):

ERROR "/homes/mb4110/SimpleMath":35 - Type error in application
*** Expression     : n r
*** Term           : n
*** Type           : Float
*** Does not match : a -> b

Вероятно, что-то очевидно, что я скучаю, но я давно этим занимаюсь и не могу придумать решение.

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

chooseF принимает два аргумента, но из-за круглых скобок n r анализируется как один аргумент. Таким образом, удалите скобки вокруг n r, и все должно быть в порядке.

2 голосов
/ 06 октября 2011

Проблема в том, что вы передаете (n r) в chooseF. Отсюда Hugs определяет, что термин n должен быть некоторой функцией типа a -> b, в которую вы передаете r. Результат этого затем будет частично применен в chooseF.

Предположительно, вы хотели вызвать chooseF с обоими n и r в качестве параметров. Чтобы исправить эту ошибку, вместо этого позвоните chooseF n r.

...