【发布时间】:2013-02-23 16:16:10
【问题描述】:
fun flat [] = []
| flat (l::ls) = l @ flat ls;
这将使列表变平。
有没有办法非递归地做同样的操作?也许是 HOF?
【问题讨论】:
-
递归有什么问题?在我看来,避免它会让它看起来更像程序化编程
-
如果可能的话,我想使用 HOPs
fun flat [] = []
| flat (l::ls) = l @ flat ls;
这将使列表变平。
有没有办法非递归地做同样的操作?也许是 HOF?
【问题讨论】:
你可以使用高阶函数List.foldr:
fun flat xs = List.foldr (fn (x, acc) => x @ acc) [] xs
正如@Andreas所说,上面的函数可以缩短:
fun flat xs = List.foldr op@ [] xs
虽然您希望将flat 实现为练习,但标准库中的List.concat 执行完全相同的操作。
【讨论】:
fun flat xs = List.foldr op@ [] xs。但实际上,标准库已经以List.concat的名义提供了这个功能。