我必须编写一个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]对吗?)但是我该怎么办呢?
谢谢
答案 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
。因此,您至少有两种工具来指导物品到达的顺序。一个是您在上述模板中的匿名函数中引用s
和res
的顺序,另一个是您选择的foldl
和foldr
。
另请注意,foldl
和foldr
将从不同方向遍历列表;分别从左边和右边。为了说明顺序,尝试折叠产生副作用的东西并看看哪个效果首先到达:
- foldl (fn (s, _) => print (s^"\n")) () ["Hello", "World!"];
Hello
World!
> val it = () : unit
- foldr (fn (s, _) => print (s^"\n")) () ["Hello", "World!"];
World!
Hello