sml中的foldl能否处理字符串列表中的元素并返回另一个列表?

sml中的foldl能否处理字符串列表中的元素并返回另一个列表?,sml,Sml,如果不是,如果我想用预定义函数修改列表中的元素,并在最后用一行代码返回一个列表,该怎么办 例如: fun upperClass是一个预定义的函数string->string,它使string中的所有字符都是大写的,这里我有一个列表[“a”、“b”、“c”] 我想用foldr return[“Ä”,“B”,“C”]非递归地编写这个函数 我之前的尝试是foldr upperClass()[“a”、“b”、“c”],结果与预期的类型不匹配,因为我通常使用OP::将这些元素放回到列表中。让我们看看列表的

如果不是,如果我想用预定义函数修改列表中的元素,并在最后用一行代码返回一个列表,该怎么办

例如: fun upperClass是一个预定义的函数string->string,它使string中的所有字符都是大写的,这里我有一个列表[“a”、“b”、“c”] 我想用foldr return[“Ä”,“B”,“C”]非递归地编写这个函数


我之前的尝试是foldr upperClass()[“a”、“b”、“c”],结果与预期的类型不匹配,因为我通常使用OP::将这些元素放回到列表中。

让我们看看
列表的
foldl
文档

如您所见,
foldl
的最终产物是函数
f
的产物。如果
f
的返回类型是一个列表,则可以返回列表。正如您所提到的,您尝试使用
,我们知道此运算符接受两个元素,一个是type
'a
元素,一个是type
'a
列表,并返回type
'a
列表
foldl
使用
(op::)
也应该返回一个列表

例如:

foldl (op ::) [] [1,2,3,4]
返回

val it = [4,3,2,1] : int list

我认为您面临的挑战是设计一个函数
f
,该函数在同时处理元素时返回一个字符串列表。(同样,按照正确的顺序。)

您所描述的,正如您自己所评论的,
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
datatype'a binaryTree=Leaf |'a*'的分支a binaryTree*'a binaryTree
有趣的插入(x,叶)=分支(x,叶,叶)
|插入(x,分支(y,左,右))=

如果你喜欢,非常感谢!对我来说,map比foldl更适合我now@SiweiWang快乐编码:P
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