相当于标题所说的内容。我刚刚开始学习SML并且遇到了第一个项目的问题。我知道这是一个非常基本的问题,对于像java这样的东西我会非常容易,但是我很难理解SML。我需要编写一个函数intsFromTo。它应该采用一对整数,低和高,并按升序返回连续整数列表,即所有大于或等于低和小于或等于高的整数。
这是我到目前为止所拥有的
fun intsFromTo (low,high) = val intList = []
if low >= high then nill
else intList::low intsFromTo(low+1,high);
我发现以下错误,我也很难理解。
http://i.imgur.com/QZ0WT6j.png
非常感谢任何帮助我前进的帮助。
答案 0 :(得分:1)
您的代码中存在几个问题,只是显示隐藏的细分以查看答案,但我只是先给出提示,以帮助您自己解决问题。
回想一下,在定义本地值时,函数体需要
let ... in ... end
,就像你在intList
那样做:
nill
是什么?您可能需要
nil
或[]
intList::low intsFromTo(low+1,high)
表达什么?你的部分几乎是正确的:你的目标是返回由当前
low
元素组成的列表,然后是从其后继者到最高元素的元素列表。这写成:low :: intsFromTo (low+1,high)
。很长的解释:你实际上并排写了两个不同的表达式(intList::low
和递归调用intsFromTo
),第一个不是函数,所以它不能应用于第二个(记住这与lambda演算中的原理相同。
然后呢?
在这些更改之后,生成的程序应该编译,但是它的实现可以改进(提示:intList
?)。这留给读者练习。
答案 1 :(得分:1)
注意:代码可能是风格更紧凑的模式,但可能无法清楚地说明基本概念。
fun intsFromTo(low, high) =
let
val out = []
in
if
low <= high
then
low :: intsFromTo2(low + 1, high)
else
out
end
生成列表的另一种方法是在列表中使用map-reduce
样式语义。
fun intsFromTo(low, high) =
if high > low
then (* the list will contain at least one value *)
if
high >= 0
then
List.tabulate((high + 1) - low,
fn k => k + low)
else
List.rev(
List.tabulate((~low + 1) + high,
fn k => ~k + high))
else
[] (* list empty: low >= high *)
为何选择? 只是出于好奇。
轶事时间表明第一个版本的速度是第二个版本的两倍:
fun time() =
let
val t = Timer.startCPUTimer();
in
intsFromTo(~1000000,1000000);
Time.toReal(#usr(Timer.checkCPUTimer(t)))
end
至少在我的电脑上用于其他事情。
答案 2 :(得分:-1)
迟到的答案,但这是一个可爱的紧凑递归定义。
fun intList a b = if (a = b) then [b]
else a::intList (a+1) b;