3
fun flat [] = []   
  | flat (l::ls) = l @ flat ls;

这将使列表变平。

有没有办法非递归地做同样的操作?也许与HOFs?

4

1 回答 1

3

您可以使用高阶函数List.foldr

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

正如@Andreas 所说,上面的功能可以缩短:

fun flat xs = List.foldr op@ [] xs

尽管您想flat作为练习来实现,但标准库中的List.concat做的事情完全相同。

于 2013-02-23T00:26:46.433 回答