如何用SML实现获取懒列表(lazyList)第n个元素的函数?
实现懒列表第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
先拆解下这段代码的核心逻辑:
- 你的懒列表类型定义完全符合懒列表的设计思路:
nullList代表空列表,cons构造器同时存储当前元素,以及一个延迟求值的无参函数来生成剩余的列表节点,这样不会提前计算所有元素,真正做到"懒"求值。 Nth函数返回'a option类型非常合理——如果列表长度不足以到达第n个元素,就返回NONE;找到目标元素则返回SOME value,完美覆盖了边界情况。- 辅助函数
iterator的递归逻辑是核心:用cur跟踪当前遍历到的位置,和目标位置target对比:- 碰到
nullList时,说明已经遍历完整个列表还没找到目标,直接返回NONE - 碰到
cons(value, tail)时,如果当前位置刚好是目标,就返回当前元素;否则调用tail()触发延迟求值,生成下一个节点,同时把当前位置加1,继续递归查找
- 碰到
不过这里有个小笔误需要修正:你在iterator的参数里把lazyListVal写成了laztListVal,这个拼写错误会导致编译报错,修正后代码就能正常运行了。
另外,如果想让函数更健壮,可以考虑提前处理n小于1的情况——比如用户传入0或者负数时,当前代码会一直递归直到碰到nullList才返回NONE,我们可以在开头加个判断优化逻辑:
datatype 'a lazyList = nullList | cons of 'a * (unit -> 'a lazyList) fun Nth(lazyListVal, n) = (* lazyList * int -> 'a option *) if n < 1 then NONE else let fun iterator (lazyListVal, 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
这样就能直接对无效的位置参数返回NONE,避免不必要的递归过程。
内容的提问来源于stack exchange,提问作者cadenzah
相关产品推荐
相关产品推荐

