【发布时间】:2018-01-09 02:10:18
【问题描述】:
列表到链接列表的转换
我正在尝试在标准 ML 中将列表转换为单链表(不确定是否可以使用双链表)。但是,我不确定这是如何完成的,但会展示我目前的尝试。
datatype 'a mlist = Nil
| Cons of 'a * 'a mlist ref
fun listToLL [] = Nil
| listToLL (x::xs) = Cons(x, (ref (listToLL xs)))
我首先在数据类型上创建了一个链表,但我对“ref”函数感到困惑。我想避免将链接列表变成惰性列表,因此我可以使用 ref 显式地将下一个序列设为仅对前一个序列的引用。但问题是这个函数根本没有使用链表数据类型,即使我不使用这个链表定义也能工作。那么我的实现真的正确吗?
作为一个附带问题,将链接列表与惰性列表区分开来的唯一因素是“ref”函数吗?从他们的数据类型定义来看,好像是这样的。
将两个链表连接在一起
fun joining (mlpx, mlpy) =
case !mlpx of
Nil => mlpx := mlpy
| Cons(_, mlp) => joining(mlp, mlpy)
fun join (mlpx, mlpy) =
let
val mlp = ref mlpx
in
joining(mlp, mlpy);
!mlp
end;
对于第二个操作,我对第二个连接函数中需要ref 感到非常困惑。当我处理一个链表时,我希望我处理一个引用还是我处理包含内部引用的整个 Cons 结构?我不明白为什么我们不能单独使用 joining 函数,因为它似乎真的足够了。为什么需要在join函数中创建ref?
【问题讨论】:
标签: linked-list sml