2015-10-19 59 views
1

我必須編寫一個SML函數,返回由給定列表中的空格分隔的單詞組成的句子。我必須至少使用foldl/foldr/map函數中的一個。返回給定列表中的字符串與單詞之間的空格 - sml

這是我寫的:

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"]); 

但是,這個功能帶來了相反的字符串(這句話與功能測試)。我在互聯網上閱讀,可以通過顛倒列表([xs]在這種情況下可以解決嗎?),但我該怎麼做?

謝謝

回答

2

你的功能add_spaces在一個美麗的令人費解,但有可能被誤解的方式使用foldr

一個普通的遞歸函數,這將不能滿足使用與foldl/foldr相似/地圖的標準,是,

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的順序,另一種是您選擇的foldl和。

另請注意,foldlfoldr將從不同的方向遍歷列表;分別從左側和右側。爲了說明順序,嘗試使用會導致副作用的東西並摺疊,看看哪些效果首先出現:

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