wvogel日記

自分用の技術備忘録が多めです.

自己拡張型辞書

まずはソースコード

import IO

main = do cs <- getContents
          search $ lines cs

search :: [String] -> IO()
search (w:ws)=do handle <- openFile "list.txt" ReadMode
                 fs <- hGetContents handle
                 putStrLn $ search' w (maketouple $ words fs)
                 hClose handle
                 search ws
	where
		search' _ [] = "There is no data....."
		search' ws (list:lists)
			| ws == fst list = snd list
			| otherwise = search' ws lists

maketouple :: [a] -> [(a,a)]
maketouple [x,y] = [(x,y)]
maketouple (x:y:xs) = (x,y):maketouple xs


最初、文字列を出力を表示する部分を、
putStrLn
ではなく
putStrとやっていたら、すべての文字入力を受け付けてからじゃないと画面に出力されなかったけれど、(遅延評価故)
改行つき出力にしてやるだけで入力毎に結果を出してくれるようになりました。
これはあれですね、改行があるだけで、そのデータ枚に出力をしないといけない、と明示できるのでそうなるのでしょう。
大分遅延評価にも慣れてきた。


ただ、もう少し綺麗に書ける気がしないでもない
まず、ファイル処理をsearch関数に書いちゃってるのはだめですね。
mainに移しておくべきか。
そしたら、ちゃんと副作用となる部分と純粋関数を分けられる。


とりあえず、骨組みは完成
あとは、単語追加機能を加えれば一応私の中では完成
(逆引きは、私の使用範囲では必要ないのでつけない。searchと似たような処理だし)