ようやく第1部の最後。ここではモジュールの説明と、Main, Prelude, System, Listモジュールが登場。モジュールは、要するに他の言語で言う所のライブラリのような物か。
モジュール名 | 役割 |
---|---|
Prelude | 暗黙の内にimportされているモジュール |
Main | main関数があるプログラムが暗黙の内になっているモジュール |
文法的な物としては、where節と``が登場。
where節は、関数の中で
foo = where bar :: ... bar = ... baz :: ... baz = ...
というように書くと、fooの中からのみ見える関数bar, bazを定義する事が出来る。where以降には、定義式となる物なら何でも書ける。
``は、
x `func` y
と書くと、
func x y
と書いた物として扱われる。
本節で登場した関数の内、主要な物は以下の通り。
- unwords
- ["str1","str2"]を"str1 str2"にする。
- any
- リスト中の要素にそれぞれ関数を適用して、1つでもTrueとなる物があればTrueを返す。
- filter
- リスト中の要素にそれぞれ関数を適用して、Trueとなる物だけを含むリストを返す。
- head
- リストの先頭要素を返す。
- tail
- リストの末尾要素を返す。
ところで、List.isPrefixOfの定義が
isPrefixOf :: (Eq a) => [a] -> [a] -> Bool
と書かれているけど、これ何だっけ。この=>ってもう出てきたっけか。
練習問題1
import List main = do cs <- getContents putStr $ unlines $ sort $ lines cs
基本的な話だけれども、lines, unlinesの使い方を忘れていてちょっと焦った。
練習問題2
import List main = do cs <- getContents putStr $ unlines $ map head $ group $ lines cs
正直、ここまで長くなると複数の関数に分割した方がいいんだろうと思う。それとも、Rubyみたいにメソッドチェインが長々と続けられる事への快感みたいな物があったりするんだろうか。
でもまあ、せっかくwhere節を学んでそれを使っていないというのももったいないと思うので、とりあえず多少分割してみる。
import List main = do cs <- getContents putStr $ unlines $ collectHead $ group $ lines cs where collectHead xs = map head xs
…それほど関数に分ける必要のある部分が無かったという罠。