Recursion 如何在SML/NJ中递归生成列表

Recursion 如何在SML/NJ中递归生成列表,recursion,sml,smlnj,Recursion,Sml,Smlnj,我是SML/NJ的新手,我想做一个递归函数 这就形成了一个列表。例如:listOf([1,2,3,4])将输出 [[1]、[2]、[3]、[4]]。我在SML/NJ中发现了一个递归的merge,我 试着把它当作我的提纲: 这个错误对我来说是陌生的,因为我没有真正的经验 使用sml/nj。如何修复我的函数列表 你很接近。问题是在模式匹配中,像xs(只是一个变量)这样的模式可以匹配任何东西。以s结尾并不意味着模式只能匹配列表的尾部。以这种方式使用s只是SML中的程序员惯例 因此,在你的定义中: fu

我是SML/NJ的新手,我想做一个递归函数 这就形成了一个列表。例如:
listOf([1,2,3,4])
将输出
[[1]、[2]、[3]、[4]]
。我在SML/NJ中发现了一个递归的
merge
,我 试着把它当作我的提纲:

这个错误对我来说是陌生的,因为我没有真正的经验 使用sml/nj。如何修复我的函数列表


你很接近。问题是在模式匹配中,像
xs
(只是一个变量)这样的模式可以匹配任何东西。以
s
结尾并不意味着模式只能匹配列表的尾部。以这种方式使用
s
只是SML中的程序员惯例

因此,在你的定义中:

fun listOf(xs) = xs
|   listOf(x::xs) = [x]::listOf(xs);
第一行告诉SML返回所有不变的值,这显然不是您的意图。SML检测到这与第二行不一致,您在第二行中尝试更改一个值

您需要更改第一行,使其与所有内容不匹配。把
merge
函数看作一个模板,您需要一些与基本情况相匹配的东西。自然基情况为
nil
(也可以写成
[]
)。注意
nil
merge
的定义中所起的作用。如果对函数定义的第一行中的模式使用
nil
而不是
xs
,则第二行完全按照您的要求执行,函数将按预期工作:

fun listOf(nil) = nil
|   listOf(x::xs) = [x]::listOf(xs);

啊,这很有道理。谢谢你的帮助!我知道stack overflow可能会对在一个问题中问另一个问题很挑剔,但由于这是一个简单的问题,我希望这不会有什么关系。我需要做一个类似的列表:
[[1]、[2]、[3]、[4]
[[1,2]、[3,4]
。既然
x
是列表的第一个值,
xs
是列表的最后一个值,那么我如何访问列表的下一个索引?根本不考虑使用索引,而是使用模式匹配。提示:
[x]:[y]::zs
是一种至少包含两个元素的列表模式,每个元素都是单例列表。
fun listOf(xs) = xs
|   listOf(x::xs) = [x]::listOf(xs);
fun listOf(nil) = nil
|   listOf(x::xs) = [x]::listOf(xs);