[MLton] Bug report

Neophytos Michael nmichael@yahoo.com
Sun, 11 Jul 2004 04:15:01 -0700 (PDT)


Your new code fixes the bug.  Thanks for the quick response and for your
excellent work on mlton.

Neophytos

--- Stephen Weeks <sweeks@sweeks.com> wrote:
> 
> > The following program raises exception "UnequalLengths".  I am
> > guessing it shouldn't.
> 
> Thanks for the bug report.  The problem was in our basis library
> implementation of the ListPair structure.  I've checked a fix into our
> CVS.  If you want to apply the fix immediately, you can replace the
> contents of
> 
> 	/usr/lib/mlton/sml/basis-library/list/list-pair.sml
> 
> on your machine with the code below.
> 
>
--------------------------------------------------------------------------------
> 
> (* Copyright (C) 1999-2004 Henry Cejtin, Matthew Fluet, Suresh
>  *    Jagannathan, and Stephen Weeks.
>  * Copyright (C) 1997-1999 NEC Research Institute.
>  *
>  * MLton is released under the GNU General Public License (GPL).
>  * Please see the file MLton-LICENSE for license information.
>  *)
> structure ListPair: LIST_PAIR =
>    struct
>       exception UnequalLengths
> 
>       fun id x = x
> 
>       fun ul _ = raise UnequalLengths
> 
>       fun unzip l =
> 	 List.foldr (fn ((x, y), (xs, ys)) => (x :: xs, y :: ys)) ([], []) l
> 
>       fun foldl' w f b (l1, l2) =
> 	 let
> 	    fun loop (l1, l2, b) =
> 	       case (l1, l2) of
> 		  ([], []) => b
> 		| (x1 :: l1, x2 :: l2) => loop (l1, l2, f (x1, x2, b))
> 		| _ => w b
> 	 in
> 	    loop (l1, l2, b)
> 	 end
> 
>       fun foldl f = foldl' id f
> 
>       fun foldlEq f = foldl' ul f
> 
>       fun foldr' w f b (l1, l2) =
> 	 let
> 	    fun loop (l1, l2) =
> 	       case (l1, l2) of
> 		  ([], []) => b
> 		| (x1 :: l1, x2 :: l2) => f (x1, x2, loop (l1, l2))
> 		| _ => w b
> 	 in
> 	    loop (l1, l2)
> 	 end
> 
>       fun foldr f = foldr' id f
> 	 
>       fun foldrEq f = foldr' ul f
> 
>       fun zip' w (l1, l2) =
> 	 rev (foldl' w (fn (x, x', l) => (x, x') :: l) [] (l1, l2))
> 
>       fun zip (l1, l2) = zip' id (l1, l2)
> 
>       fun zipEq (l1, l2) = zip' ul (l1, l2)
> 	 
>       fun map' w f = rev o (foldl' w (fn (x1, x2, l) => f (x1, x2) :: l) [])
> 
>       fun map f = map' id f
> 
>       fun mapEq f = map' ul f
> 	 
>       fun app' w f = foldl' w (fn (x1, x2, ()) => f (x1, x2)) ()
> 
>       fun app f = app' id f
> 
>       fun appEq f = app' ul f
> 
>       fun exists p (l1, l2) =
> 	 let
> 	    fun loop (l1, l2) =
> 	       case (l1, l2) of
> 		  (x1 :: l1, x2 :: l2) => p (x1, x2) orelse loop (l1, l2)
> 		| _ => false
> 	 in
> 	    loop (l1, l2)
> 	 end
>        
>       fun all p ls = not (exists (not o p) ls)
> 
>       fun allEq p =
> 	 let
> 	    fun loop (l1, l2) =
> 	       case (l1, l2) of
> 		  ([], []) => true
> 		| (x1 :: l1, x2 :: l2) => p (x1, x2) andalso loop (l1, l2)
> 		| _ => false
> 	 in
> 	    loop
> 	 end
>    end
> 



		
__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - Send 10MB messages!
http://promotions.yahoo.com/new_mail