首页 > 解决方案 > 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]。我将如何仅在一个函数中执行此操作?

标签: smlsmlnj

解决方案


您已经在一个函数中创建了反向列表,而没有使用 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。由于问题陈述对此不清楚,因此回答可能不令人满意。

要么创建一个函数,并允许其类型签名不同(采用额外的参数),要么创建一个公开的函数并允许它具有一个内部函数,该函数反向累积结果。


推荐阅读