【发布时间】:2023-08-13 06:07:01
【问题描述】:
我正在尝试制作一个可以返回lazylist的特定第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
我期望的结果是,随着recusing的进行,最终变量cur与变量target相同,然后函数迭代器返回 SOME value 所以它会返回最后的第 n 个元素。
但是当我编译并运行它时,它只返回第一个元素,但是我使用惰性列表对象进行测试。
请找出问题所在。我不知道...
cf) 我制作了另一个与此问题相关的函数,该函数将lazylist 转换为包含前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 正常工作。
【问题讨论】:
-
firstN有效,因为它没有Nth的错字错误。它的参数lazyListVal隐藏了其父级的同名参数,而Nth将其自己的参数称为与其父级不同的参数,并随后引用其父级(列表的头部)而不是自己的。