>>684
bsearchの最後の等式で、再帰的に呼ばれたbsearchが-1を返したときにまずいことになる。
これを防ぐには、結果が-1かどうかを明示的にテストすればいい。
bsearch k [] = -1
bsearch k x 
  | median x > k  = bsearch k (take (middle x) x) 
  | median x == k = middle x 
  | median x < k  = case bsearch k (drop ((middle x)+1) x) of
    -1 -> -1
    r -> middle x + 1 + r

以下、本題とは関係ないけど、
・Haskellではbsearchのような「失敗する可能性のある」関数の結果はMaybeでラップするのが普通。
失敗時に-1を返すよりNothingを返した方が直感的だし、間違いも少ない。
・ceiling (fromIntegral (length x) / fromIntegral 2) は div (length x) 2と書ける。