我正在阅读Chris Okasaki纯粹的功能数据结构,并且有一个例子我遇到了麻烦。它位于here。特别是,我不明白rotate
和exec
函数的工作原理:
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的语言。 : - )
答案 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实施,以便更多地使用_
模式和::
。