関数内関数
fgrep.hsの作成。盛りだくさんでした。
head関数はリストの先頭の要素を返す関数。そのままですね。tail関数はリストの先頭の要素を除いたリストを返す関数。リストの末尾の要素を返してきそうな関数ですが違いました。
filterはリストから条件に合った要素のリストを返す関数。分かりやすい名前です。Perlのgrep関数に似ていますね。
anyはリストの各要素に関数を適用していずれかがTrueの場合にTrueを返す関数。分かりやすい名前なのでしょうか? 英語はものすごく苦手なので全然分かりません。
isPrefixOfは前方一致の場合にTrueを返す関数。前方一致があるのだったら中間一致や後方一致があっても良さそうな気がしますが、少なくとも中間一致はないみたいです。
where節を使うと関数内関数を定義できます。
文字列のマッチを調べるのにList.tailsでリストをたくさん作ってisPrefixOfで比較するというやり方をしていて、これが効率悪そうなんて思ってしまったのですが、実際は大したことないのでしょうか。よく分かりません。
List.tailsの動きを見てみたかったので以下のスクリプトを作成。
import List import System main = do args <- System.getArgs print $ List.tails $ head args
>tails hello ["hello","ello","llo","lo","o",""]
文字列のマッチのためにこんなことをするのは、やっぱり無駄なことやっているように感じてしまいますね。
isPrefixOfは isPrefixOf xs ys なのですが xs `isPrefixOf` ys とも書くことが可能。この書き方はちょっと良いですね。