【问题标题】:How to flatten a list non-recursively in sml/nj?如何在 sml/nj 中非递归地展平列表?
【发布时间】:2013-02-23 16:16:10
【问题描述】:
fun flat [] = []   
  | flat (l::ls) = l @ flat ls;

这将使列表变平。

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

【问题讨论】:

  • 递归有什么问题?在我看来,避免它会让它看起来更像程序化编程
  • 如果可能的话,我想使用 HOPs

标签: list sml smlnj


【解决方案1】:

你可以使用高阶函数List.foldr:

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

正如@Andreas所说,上面的函数可以缩短:

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

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

【讨论】:

  • 谢谢。这很有帮助。
  • @Dickson:甚至更短:fun flat xs = List.foldr op@ [] xs。但实际上,标准库已经以List.concat的名义提供了这个功能。
  • @AndreasRossberg:谢谢。我根据您的建议更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2010-09-16
  • 2011-12-22
  • 2018-03-19
相关资源
最近更新 更多