你所描述的是,正如你自己评论的那样,map:
val uppercase = String.map Char.toUpper
val uppercaseMany = List.map uppercase
您应该选择map,因为它最准确地描述了您正在做的事情,因为它可以更快地传达您的代码意图。
map 比foldl 做了一些更具体的事情,因为map 只能返回一个元素数量与其输入相同的列表,其中每个元素都以完全相同的方式进行了转换,并且独立于其他功能(至少在map自己同意的范围内)。
事实上,map 是foldr 的一个特例,因为您可以使用foldr 来实现map,但反之则不行:
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,但是you can also express one using the other。
折叠的想法可以适用于任何树结构,而不仅仅是列表。这是how to fold binary trees 上的 StackOverflow 答案,这是Tail-recursion on trees 上的 StackOverflow 问答。