首页 文章

返回给定列表中的字符串,单词之间有空格 - sml

提问于
浏览
1

我必须编写一个SML函数,该函数返回一个句子,该句子由给定列表中的空格分隔 . 我必须使用foldl / foldr / map函数中的至少一个 .

这就是我写的:

fun add_spaces nil = ""
  | add_spaces(x::xs) = foldr (fn (x,xs) => (add_spaces x)^" "^xs) x [xs];

add_spaces(["Testing","function","with","this","sentence"]);

但是这个函数会带来一个反向的字符串(用函数Testing来判断它) . 我在互联网上读到可以通过反转列表来解决(在这种情况下是[xs]对吗?)但是我该怎么做呢?

谢谢

1 回答

  • 2

    你的函数 add_spaces 以一种非常复杂但可能被误解的方式使用 foldr .

    一个常规的递归函数,它不符合使用foldl / foldr / map的标准,是

    fun add_spaces [] = ""
      | add_spaces [s] = s
      | add_spaces (s::ss) = s ^ " " ^ add_spaces ss
    

    依赖折叠进行递归的类似函数将遵循一种模式,

    fun add_spaces [] = ""
      | add_spaces (s1::ss) = fold<l/r> (fn (s,res) => ...) s1 ss
    

    其中 ... 显式不引用 add_spaces . 因此,您至少有两种工具来指导物品到达的顺序 . 一个是您在上述模板中的匿名函数中引用 sres 的顺序,另一个是您选择的 foldlfoldr .

    另请注意 foldlfoldr 将从不同方向遍历列表;分别从左边和右边 . 为了说明顺序,尝试使用会产生副作用的东西进行折叠并查看哪些效果首先到达:

    - ​foldl (fn (s, _) => print (s^"\n")) () ["Hello", "World!"];
    Hello
    World!
    > val it = () : unit
    - ​foldr (fn (s, _) => print (s^"\n")) () ["Hello", "World!"];
    World!
    Hello
    

相关问题