二分探索を書こうとしたのだが、どうも上手くできない。

--リストの中央インデックスを求める
middle :: [a] -> Int
middle [] = -1
middle x = (ceiling half) - 1
where half = fromIntegral (length x) / fromIntegral 2

--リストの中央値を返す
median :: [a] -> a
median x = x !! (middle x)

bsearch k [] = -1
bsearch k x
| median x > k = bsearch k (take (middle x) x)
| median x == k = middle x
| median x < k = middle x + 1 + bsearch k (drop ((middle x)+1) x)

「bsearch k [] = -1」が悪いのはわかってるんだが、
うまく動くよう記述する方法がわかんない。
どうすればいい?