Search code examples
mlinfinite-sequence

multi-directional infinte sequence - ML


I want to use the datatype sequence that is defined as follows:

 datatype 'a seq = Nil | Cons of 'a * (unit-> 'a seq);
 exception EmptySeq; 
 fun head(Cons(x,_)) = x | head Nil = raise EmptySeq; 
 fun tail(Cons(_,xf)) = xf() | tail Nil = raise EmptySeq;

which has to option to iterate over functions backward and forward:

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

and i defined those as well:

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;

Now, what I'm trying to do is to create a function "create_seq" that gets an int "k" and returns an infinte sequence which can be iterated back and forth. for example:

 - create_seq 2; 
val it = bCons (2,fn) : int bseq 
- bForward it; 
val it = bCons (3,fn) : int bseq 
- bForward it; 
val it = bCons (4,fn) : int bseq 
- bBack it; 
val it = bCons (3,fn) : int bseq 
- bBack it; 
val it = bCons (2,fn) : int bseq 
- bBack it; 
val it = bCons (1,fn) : int bseq 
- bBack it; 
val it = bCons (0,fn) : int bseq 
- bBack it; 
val it = bCons (~1,fn) : int bseq

this is what I've been trying to do and can't figure out why it doesn't work:

fun create_seq k = (k,fun check Forward = create_seq(k+1) 
| check Back = create_seq(k-1));

nor this:

fun create_seq k = (k,fn x => case x of Forward => create_seq(k+1)
                       | Back => create_seq(k-1));

or even this:

fun create_seq k = (k,fn Forward => create_seq(k+1)
                       | Back => create_seq(k-1));

Solution

  • It seems I forgot the constructor:

    fun intbseq(k:int) = bCons(k,fn Forward => intbseq(k+1)| Back => intbseq(k-1));
    

    this should work.