ファイル中の文字列を検索して、ヒットした位置のリストを表示するコマンド

取り敢えず、Haskell版は完成しました。
初めての検索関数でしたが、何とか作れました。
アルゴリズムに詳しくないので、力押し検索です。
一応、本には力押し検索は意外と有効なアルゴリズムと書いてありましたし、難しく考えなくても有効な手法と言うのは、良いですね。

Haskellでは、リストを返り値にする再帰の場合、スタックを消費しないので、こういう処理は再帰の単純さがフルに活かせて良い感じです。

import System.Environment

search _ _ [] = []
search (y,x) s (n:ns) | (take (length s) (n:ns)) == s = (y,x):search (y,x + 1) s ns
search (y,x) s (n:ns) | n == '\n' = search (y + 1,1) s ns
search (y,x) s (_:ns) = search (y,x + 1) s ns

main = getArgs >>= \com ->
		readFile (com!!0) >>=
		return.search (1,1) (com!!1) >>= \tlst ->
		putStrLn (com!!0) >>
		print tlst
		

使用例はこんな感じです。

>search search.hs search
search.hs
[(3,1),(4,1),(4,63),(5,1),(5,37),(6,1),(6,25),(10,10)]

所で、すでに他の言語で作る気力が無いです・・・
(と言うか、他の言語では作れる自信がちょっと無いです・・・)

来週は日曜日も忙しいですし・・・
26,27日ぐらいにはPython/Rubyで書く時間も作れそうですが、あまり期待はしないで下さい。