在ML中创建序列

时间:2014-06-04 22:54:00

标签: sequence ml

 datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq);

 fun head(Cons(x,_)) = x | head Nil = raise EmptySeq;
 fun tail(Cons(_,xf)) = xf() | tail Nil = raise EmptySeq;

 datatype direction = Back | Forward;
 datatype 'a bseq =   bNil 
                    | bCons of 'a * (direction -> 'a bseq); 

 fun bHead(bCons(x,_)) = x | bHead bNil = raise EmptySeq; 
 fun bForward(bCons(_,xf)) = xf(Forward) | bForward bNil = raise EmptySeq; 
 fun bBack(bCons(_,xf)) = xf(Back) | bBack bNil = raise EmptySeq; 

所以那些定义之后。这就是我想要做的。我需要采取2个序列并将它们分成1个序列,我可以移动Farward和Back。 例如,如果1个序列是0123 ...而2是-1-2-3-4 ......,我得到-4-3-2-10123。 我当前的位置必须始终是“up”序列的第一个元素。 这就是我试过的事情:

 (*************************************************************)
 local
     fun append_aux (Nil, yq) = yq
        |append_aux (Cons(x,xf), yq) = Cons(x,fn() => append_aux(xf(),yq))
     fun append(t,yq) = append_aux(Cons(t,fn() => Nil),yq)
 in
     fun seq2bseq (Cons(x,xrev)) (Cons(y,ynorm)) = bCons(y,fn Farward => seq2bseq      (append(y,Cons(x,xrev))) (ynorm())
                                                        |Back    => seq2bseq (xrev()) (append(x,Cons(y,ynorm)))) 
   |seq2bseq  (_) (_) = bNil                                              
 end;   

但是我为“后退”比赛收到错误“匹配多余”,我无法弄清楚原因。

0 个答案:

没有答案