Search code examples
functional-programmingsmlsmlnj

Issue in sorting SML list


I am new to SML.I got this sorting algo to implement where in each iteration,I have to pick minimum element from the list, remove it and create sorted list.

I did below coding to solve the problem.

I wrote 2 helper functions to pickup minimum element from the list and remove one element from the list.

fun minList(x::xs) =List.foldl (fn (x,y)=> if x<y then x else y) x (x::xs);

fun remElem(x, l) =
   case l of
   [] => []
 | (x1::x2::xs) => if x1=x then (x2::xs) else (x1::xs)
;

Above two programs ran successfully.

Below is my sorting code.

fun simpSort(xs)=
let fun aux(xs,acc)=
       case xs of
            [] =>acc
           | [x] => [x]
            | (x::xs) => let val m = minList(xs) 
                       in
                     aux(remElem(m,xs),acc@[m])
                       end
in aux(xs,[])
end;

This sorting program is giving error.

  • simpSort([3,1]);

    uncaught exception Match [nonexhaustive match failure] raised at: stdIn:433.59

Please advise.


Solution

  • Since you've solved your problem, here are some hints for improving a working version of your code:

    • Find the minimum of a list in a way that supports empty lists:

      fun minimum [] = NONE
        | minimum (x::xs) = SOME (foldl Int.min x xs)
      
    • Simplify pattern matching in the function that removes the first occurrence of an element from a list:

      fun remove (_, []) = []
        | remove (y, x::xs) =
          if x = y
          then xs
          else x :: remove (y, xs)
      
    • Use those in combination to write simpSort:

      fun simpSort xs =
          case minimum xs of
               NONE => []
             | SOME x => x :: simpSort (remove (x, xs))
      

    I shouldn't have to say that this sorting algorithm is terribly inefficient. :-P