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

时间:2015-10-19 00:43:28

标签: sml smlnj

我必须编写一个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 个答案:

答案 0 :(得分: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