Я было дано задание, чтобы вычислить длину списка, используя функцию foldr
Haskell, так что я сделал эти два примераХаскел: Вычислить длину списка, используя (карри SND)
flength :: [a] -> Int
flength = foldr (\ _ n -> n+1) 0
flength' :: [a] -> Int
flength' l = foldr aux 0 l
where
aux _ n = n+1
Тогда, как личный вызов, профессор попросил нас использовать функцию snd
и вчера я пришел с этим:
flength'' :: [a] -> Int
flength'' = foldr ((+1).(curry snd)) 0
То, что я хочу, чтобы это произошло, что эта функция повернет голову списка h
и аккумулятор 0
в пару (h,0)
затем вернуться 0
и после этого применить его к функции (+1)
я ожидал, чтобы это было сделано рекурсивно, фактически давая мне длину списка в конце.
Вместо этого я получаю сообщение об ошибке:
[1 of 1] Compiling Main (f1.hs, interpreted)
f1.hs:54:24: error:
* No instance for (Num (Int -> Int))
arising from an operator section
(maybe you haven't applied a function to enough arguments?)
* In the first argument of `(.)', namely `(+ 1)'
In the first argument of `foldr', namely `((+ 1) . (curry snd))'
In the expression: foldr ((+ 1) . (curry snd)) 0 xs
Failed, modules loaded: none.
Почему это происходит и как я могу получить этот код, чтобы работать?
попробовать '((+1).). карри snd' – user2407038