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)