То, что вы описываете, как вы сами комментируете, map
:
val uppercase = String.map Char.toUpper
val uppercaseMany = List.map uppercase
Вы должны выбрать map
, когда оно наиболее точно описывает то, что вы делаете, поскольку оно передает цель вашегокод быстрее.
map
делает что-то более конкретное, чем foldl
, поскольку map
всегда может только возвращать список с тем же количеством элементов, что и его входные данные, где каждый элемент был преобразован точно втаким же образом и независимо от других функций (по крайней мере, в пределах собственной воли map
).
Фактически, map
является частным случаем foldr
, поскольку вы можете реализовать map
используя foldr
, но не наоборот:
fun map f = foldr (fn (x, xs) => f x :: xs) []
foldl
и foldr
может свести список вещей к чему угодно, например к дереву:
datatype 'a binaryTree = Leaf | Branch of 'a * 'a binaryTree * 'a binaryTree
fun insert (x, Leaf) = Branch (x, Leaf, Leaf)
| insert (x, Branch (y, left, right)) =
if x <= y then Branch (y, insert (x, left), right)
else Branch (y, left, insert (x, right))
val listToTree = foldl insert Leaf
Я выбрал foldl
и foldr
удобно, но вы также можете выразить одно с помощью другого .
Идея свертывания может работать с любой древовидной структурой, а не только со списками.Вот ответ StackOverflow на , как складывать бинарные деревья , и вот вопросы и ответы StackOverflow на Хвостовая рекурсия на деревьях .