benutzt Prelude.[]:
binsert :: Ord a => a -> [a] -> [a]
binsert x xs =
    if null xs then [x] else
    let ( pre, mid : post ) = 
            splitAt ( div (length xs) 2 ) xs
    in  if x < mid
        then binsert x pre ++ mid : post
        else pre ++ mid : binsert x post
        
bisort :: Ord a => [a] -> [a]             
bisort = foldr binsert []
benutzt Data.Sequence.Seq:
import Data.Sequence ( Seq )
import qualified Data.Sequence as S
binsert :: Ord a => a -> Seq a -> Seq a
binsert x xs =
    if S.null xs then S.singleton x else
    let ( pre, midpost ) = 
            S.splitAt ( div (S.length xs) 2 ) xs
        mid S.:< post = S.viewl midpost
    in  if x < mid
        then binsert x pre S.>< midpost        
        else pre S.>< mid S.<| binsert x post
bisort :: Ord a => [a] -> Seq a
bisort = foldr binsert S.empty
Bemerkungen:
bisort $ reverse [1 .. 10000]
bisort ist wirklich nur ein Test.
  Wenn es nur um das Einfügen in geordnete Listen geht,
  dann sollte man von Anfang an einen Suchbaum verwenden.