如何在sml / nj中非递归地展平列表?

时间:2013-02-23 00:12:48

标签: list sml smlnj

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

这会使列表变平。

有没有办法非递归地执行相同的操作?也许和HOF一起?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

虽然您希望将flat作为练习来实现,但标准库中的List.concat却完全相同。