Это означает именно то, что говорит ошибка.Вы указали, что тип вашей функции
divideby :: ( Int->Int -> Int ) -> Int ->float
Это означает, что первый аргумент должен быть функцией с типом Int->Int -> Int
, а второй вход должен быть Int
, а затемэто произведет float
.Естественно, Haskell не знает, как разделить функцию на Int, что вы и говорите ей делать с выражением f / z
.
В ответ на комментарий: нет.Это не функция высшего порядка, но она близка.Посмотрите:
addNum :: Int -> Int -> Int
addNum a b = a + b
divideBy :: Int -> Int -> Int -> Int
divideBy a b c = (addNum a b) `div` c
divideBy
- это функция, которая принимает 3 Int
с в качестве ввода и выдает Int
.Поскольку его входные данные просто Int
, это , а не функция высшего порядка.Однако вы можете абстрагироваться от использования addNum
на входе, тем самым сделав его функцией более высокого порядка.addNum
имеет тип (Int -> Int -> Int)
, поэтому, в дополнение к уже имеющимся входам, мы сделаем так, чтобы тип нашего первого входа
divideBy :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int
divideBy f a b c = (f a b) `div` c
Этот был вышефункция порядка, которая также правильно компилируется и имеет значение.:) Вы можете передать addNum
в качестве входа для этой функции.
ghci> divideBy addNum 2 4 6 -- (2 + 4) / 6
1