我有一个多级优先级队列,它实现为(level:int,priority:int,' a)的列表。数据类型如下所示:
datatype 'a queue = NONE | Q of (int * int * 'a) list;
较低级别的元素位于队列的前面。同级别的元素根据优先级排序。我有一个入队功能
因此,如果现有队列是:val a = Q [(3,2,"c"),(3,2,"d"),(5,2,"b"),(5,3,"a")],
然后,排队1" e"
给出
val a = Q [(1,5,"e"),(3,2,"c"),(3,2,"d"),(5,2,"b"),(5,3,"a")]
我必须编写一个函数move,它在谓词p上运行,它将满足谓词p的所有元素移动到q中的较低级别队列。 那就是:val move :(' a - > bool) - > '队列 - > '队列 以下定义不会起作用。
fun move pred (Q((l,p,v)::xs)) = if (pred (v)) then enqueue (Q xs) (l-1) p v else (move pred (Q xs))
| move pred (Q[]) = raise Empty
我刚开始学习sml。请帮忙。
答案 0 :(得分:0)
首先,有一个名为NONE
的构造函数是坏的,因为它覆盖了。{
内置选项类型的同名值。其次,你说的元素
谓词满足的应该移到较低的水平 - 是那个级别
总是比以前的水平少一个?
您的move
将无效,因为您显然不会递归调用它
当pred v
为真时,仅当它不是时。如果您将(l,p,v)
排入队列
递归调用move pred
的队列(即move pred (Q xs)
而不是Q xs
),也许它会更好。
另请注意,此问题非常适合通过折叠解决:
fun move pred (Q elems) =
let fun enq ((l,p,v), q) = enqueue q (if pred v then l-1 else l) p v
in foldl enq (Q []) elems end
答案 1 :(得分:0)
有趣的移动pred(Q((l,p,v):: xs))= if(pred(v))然后入队(Q xs)(l-1)pv else入队(移动pred(Q xs) )lpv |移动pred(Q [])=提升空 这也有效!