这个标准ML代码究竟做了什么?

时间:2009-11-12 21:07:02

标签: ml persistent-data

我正在阅读Chris Okasaki纯粹的功能数据结构,并且有一个例子我遇到了麻烦。它位于here。特别是,我不明白rotateexec函数的工作原理:

fun rotate($Nil, y::_, a) = $Cons (y, a)
    | rotate ($Cons (x, xs), y :: ys, a) = 
        $Cons(x, rotate (xs, ys, $Cons (y, a)))

fun exec (f, r, $Cons (X, s)) = (f, r, s)
    | exec (f, r, $Nil) = let val f' = rotate (f, r, $Nil) in (f', [], f') end

有人会用愚蠢的人的话来说这个吗?我还在学习基于ML的语言。 : - )

2 个答案:

答案 0 :(得分:1)

这看起来不像我学过的标准ML(在数据构造函数前面有$字符),但也许事情已经发生了变化。总之:

首先,旋转的第2行有一个小错字,你在$Cons之后添加了一个逗号

基本上,旋转采用三个列表的元组并按顺序组装它们:第一个++(与第二个相反)++第三个。但它通过同时从列表1和列表2中提取元素来线性地执行此操作。列表1的头部是最终结果(o(1)操作)。但是列表2的尾部作为参数传递给递归调用,并且它的头部被置于第三个参数上,这相当于反转它。

第三个参数基本上充当累加器。在使用累加器作为参数的函数式编程中,可以避免更昂贵的计算。

我承认不理解执行官的目的。背景是什么?

答案 1 :(得分:1)

这并不能解释整个事情,但请注意,在fun rotate($Nil, y::_, a)中,y::_是一个匹配列表的模式,其中您将列表的头部(第一个元素)标记为{{ 1}}和列表的尾部(第一个元素后的每个项目)为y_充当通配符模式。

查看SML on Wikipedia,特别是Mergesort实施,以便更多地使用_模式和::