foldr (:) [] xs == xs
- это True
для любого xs
. Это означает, что foldr (:) []
является функцией идентификации в списках. Этот факт широко известен, он настолько известен в Haskell, что опытный программист на Haskell автоматически читает foldr (:) []
как id
.
Один способ увидеть foldr c n
состоит в замене «против» (то есть (:)
) на c
и []
на n
в данном списке. Замена (:)
на (:)
и []
на []
, очевидно, ничего не изменит:
[a, b, ..., z] ==> a : b : ... : z : [] == [a, b, ..., z]
Заменив (:)
s на (++)
, с другой стороны, все списки внутри входного списка будут объединены в один:
[a, b, ..., z] ==> a ++ b ++ ... ++ z
чего вы и хотели достичь.
Таким образом, правильная реализация для concat
с foldr
равна foldr (++) []
.