我正在尝试制作一个可以返回惰性列表的特定第 n 个元素的函数。
这是我做的:
datatype 'a lazyList = nullList
| cons of 'a * (unit -> 'a lazyList)
fun Nth(lazyListVal, n) = (* lazyList * int -> 'a option *)
let fun iterator (laztListVal, cur, target) =
case lazyListVal of
nullList => NONE
| cons(value, tail) => if cur = target
then SOME value
else iterator (tail(), cur+1, target)
in
iterator(lazyListVal,1,n)
end
我期望结果是随着再利用的进行,最终变量与变量cur
相同target
,然后函数迭代器返回SOME value
,因此它将返回最后的第 n 个元素。
但是当我编译并运行它时,它只返回第一个元素,但是我用惰性列表对象进行测试。
请弄清楚是什么问题。我不知道...
cf)我制作了另一个与此问题相关的函数,该函数将惰性列表转换为包含前 N 个值的 SML 原始列表。上面的代码:
fun firstN (lazyListVal, n) = (* lazyList * int -> 'a list *)
let fun iterator (lazyListVal, cur, last) =
case lazyListVal of
nullList => []
| cons(value, tail) => if cur = last
then []
else value::iterator(tail(),cur+1,last)
in
iterator(lazyListVal,0,n)
end
奇怪的是函数 firstN 工作正常。