fun flat [] = []
| flat (l::ls) = l @ flat ls;
这将使列表变平。
有没有办法非递归地做同样的操作?也许与HOFs?
您可以使用高阶函数List.foldr:
fun flat xs = List.foldr (fn (x, acc) => x @ acc) [] xs
正如@Andreas 所说,上面的功能可以缩短:
fun flat xs = List.foldr op@ [] xs
尽管您想flat
作为练习来实现,但标准库中的List.concat做的事情完全相同。