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