sml - SML 列表 [1, 2, 3,...n]
问题描述
我需要在不使用预先实现的 List 函数的情况下创建一个列表 [1,2,3...n]。我可以通过编写向后列出列表:
fun makeList(x : int) =
if x = 0
then []
else x :: makeList(x-1)
如果输入 4,我可以反转它并得到 [1,2,3,4]。我将如何仅在一个函数中执行此操作?
解决方案
您已经在一个函数中创建了反向列表,而没有使用 List 库。
要使其以正确的顺序排列,您可以使用累积参数:
fun makeList 0 result = result
| makeList n result = makeList (n-1) (n :: result)
测试这个:
- makeList 10 [];
> val it = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] : int list
这个函数接受一个额外的参数,它以正确的顺序累积结果。
这就是在本问答中绊倒其他通讯员的原因,也是让以前的回答者删除他们的回复的原因:要么你接受这makeList
需要一个额外的空列表作为初始参数,这有点混乱,要么你将此函数嵌套在另一个隐藏的函数中这个机制:
fun makeList n =
let fun go 0 result = result
| go i result = go (i-1) (i :: result)
in go n [] end
但是那样你就不会使用一个功能。除非您指的是一个公开的函数,因为内部函数仅在定义的上下文中可用makeList
。由于问题陈述对此不清楚,因此回答可能不令人满意。
要么创建一个函数,并允许其类型签名不同(采用额外的参数),要么创建一个公开的函数并允许它具有一个内部函数,该函数反向累积结果。
推荐阅读
- oracle - SSIS 错误:执行 SQL 任务时出现 0xC002F210,执行 SQL 任务
- c++ - 无法在 Windows 上编译 TensorFlow 2.4.1 (CPP)
- unity3d - 统一 Vuforia 区域目标场景中的音频源
- jenkins - 在詹金斯管道中运行掌舵
- c# - 如何在同一个文件中添加 XML 模式和 XML 元素?
- c++ - Void 类型的参数与 pthread c++ 不兼容
- ruby-on-rails - 检查 false.present?在 Ruby On Rails 中
- python - 为什么他的 Weights_init 值发生变化?
- amazon-web-services - 如何在 Apache 上部署 NuxtJs 应用程序并使用 IP-URL 而不是域访问它?
- javascript - 等待图像类在 JavaScript 中加载