Haskell で線形探索(番兵)

同じように配列に対する線形探索を書いた。Haskell のリストをわざわざメモリ上に保存しなおしているという無駄があるがサンプルなので気にしないことにする。

linearSearch :: (Eq a, Storable a) => a -> [a] -> IO (Bool, Int)
linearSearch target xs =
  let n = length xs
  in
   do
     p <- mallocArray (n + 1)
     mapM_ (\(x, i) -> pokeElemOff p i x) (zip xs [0..])
     pokeElemOff p n target -- 番兵
     i <- search p target 0
     if i == n then
       return (False, i)
       else
       return (True, i)
  where
    search p x i = do  
      y <- peekElemOff p i
      if x == y then
        return i
        else
        search p x (i + 1)