В списке [x1, x2, ..., xk]
ваш listFoldr
вычисляет
f xk (... (f x2 (f x1 i)) ...)
, тогда как foldr
должен вычислять
f x1 (f x2 (... (f xk i) ...))
(Для сравнения foldl
вычисляет
f (... (f (f i x1) x2) ...) xk
По существу, listFoldr f = foldl (flip f)
.)
Ты тестовый случай неудачный, потому что
3 - (2 - (1 - 4)) = 1 - (2 - (3 - 4))
Когда вы тестируете подобные функции, обязательно передайте f
, который не является коммутативным и неассоциативным (т. Е. Аргумент и порядок приложения имеют значение), так что вы можете быть уверены, что выражение оценено правильно. Конечно, вычитание некоммутативно и неассоциативно, и вам просто не повезло.