【问题标题】:can foldl in sml process the elements in a string list and return another list?sml中的foldl可以处理字符串列表中的元素并返回另一个列表吗?
【发布时间】:2019-03-07 22:23:55
【问题描述】:

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

例如: fun upperClass 是预定义的函数 string -> string ,它使字符串中的所有字符成为大类,这里我有一个列表 ["a","b","c"] 我想以非递归方式编写此函数,并使用 foldr return ["Ä","B","C"]。

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

【问题讨论】:

    标签: sml


    【解决方案1】:

    我们来看看foldllisthttp://sml-family.org/Basis/list.html#SIG:LIST.foldl:VALfoldl的文档

    foldl f init [x1, x2, ..., xn]
       returns
    
       f(xn,...,f(x2, f(x1, init))...)
    
       or init if the list is empty. 
    

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

    例子:

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

    返回

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

    我认为你面临的挑战是想出一个函数f,它在同时处理元素的同时返回一个字符串列表。 (另外,按正确的顺序。)

    【讨论】:

    • 非常感谢!对我来说,这里似乎 map 比 foldl 更好
    • @SiweiWang 快乐编码:P
    【解决方案2】:

    你所描述的是,正如你自己评论的那样,map

    val uppercase = String.map Char.toUpper
    val uppercaseMany = List.map uppercase
    

    您应该选择map,因为它最准确地描述了您正在做的事情,因为它可以更快地传达您的代码意图。

    mapfoldl 做了一些更具体的事情,因为map 只能返回一个元素数量与其输入相同的列表,其中每个元素都以完全相同的方式进行了转换,并且独立于其他功能(至少在map自己同意的范围内)。

    事实上,mapfoldr 的一个特例,因为您可以使用foldr 来实现map,但反之则不行:

    fun map f = foldr (fn (x, xs) => f x :: xs) []
    

    foldlfoldr 可以将事物列表简化为任何事物,例如一棵树:

    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
    

    我很方便地选择了foldlfoldr,但是you can also express one using the other

    折叠的想法可以适用于任何树结构,而不仅仅是列表。这是how to fold binary trees 上的 StackOverflow 答案,这是Tail-recursion on trees 上的 StackOverflow 问答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2019-08-03
      • 2022-11-13
      • 1970-01-01
      相关资源
      最近更新 更多