Я изучаю Haskell на курсе в университете, и есть экзамен-упражнение, где нам нужно определить функцию, которая принимает список функций [(Int ->Int)]
и другой параметр типа Int
и возвращает Int
. Таким образом, тип должен быть
compose :: [(Int ->Int)] -> Int -> Int.
Функция должна вернуть состав функций в списке слева направо и применить его ко второму параметру. Я пробовал следующее:
compose :: [(Int -> Int)] -> Int -> Int
compose [] x = x
compose (f:fs) x
|fs == [] = f x
|f : (compose fs x)
Но компилятор выдает ошибку:
003Exam.hs:24:22:
Couldn't match expected type ‘Int’ with actual type ‘[Int -> Int]’
In the expression: f : (compose fs x)
In an equation for ‘compose’:
compose (f : fs) x
| fs == [] = f x
| otherwise = f : (compose fs x)
003Exam.hs:24:28:
Couldn't match expected type ‘[Int -> Int]’ with actual type ‘Int’
In the second argument of ‘(:)’, namely ‘(compose fs x)’
In the expression: f : (compose fs x)
Если я оставлю последнюю строку, например:
compose :: [(Int -> Int)] -> Int -> Int
compose [] x = x
compose (f:fs) x
|fs == [] = f x
то я также получаю сообщение об ошибке - это то, что я действительно не понимаю:
003Exam.hs:23:13:
No instance for (Eq (Int -> Int))
(maybe you haven't applied enough arguments to a function?)
arising from a use of ‘==’
In the expression: fs == []
In a stmt of a pattern guard for
an equation for ‘compose’:
fs == []
In an equation for ‘compose’: compose (f : fs) x | fs == [] = f x
Я был бы рад за любую помощь, которая проясняет, что я делаю неправильно.