2013-02-23 46 views
2
fun flat [] = [] 
    | flat (l::ls) = l @ flat ls; 

這將扁平列表。如何在sml/nj中以非遞歸方式展平列表?

有沒有辦法以非遞歸方式做同樣的操作?也許與HOFs?

+0

遞歸有什麼問題?避免它會使它看起來更像程序編程在我看來 – Ulises 2013-02-23 00:21:08

+1

我想使用HOP或許,如果可能的話 – Dickson 2013-02-23 00:22:56

回答

2

你可以使用高階函數List.foldr

fun flat xs = List.foldr (fn (x, acc) => x @ acc) [] xs 

正如@Andreas說,上面的函數可以被縮短:

fun flat xs = List.foldr [email protected] [] xs 

雖然你想實現flat作爲練習,標準庫中的​​完全一樣。

+0

謝謝。這非常有幫助。 – Dickson 2013-02-23 00:38:39

+0

@Dickson:甚至更短:''flat flat xs = List.foldr op @ [] xs''。但實際上,標準庫已經在名稱「List.concat」下提供了這個功能。 – 2013-02-23 07:23:14

+0

@AndreasRossberg:謝謝。我用你的建議更新了我的答案。 – pad 2013-02-23 08:16:51

相關問題