Recursion 如何在SML/NJ中递归生成列表
我是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
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);