一汁三菜

自分が楽しいと思うこと、マラソン、旅行、その他日々の記録をしたい。

第4章 Haskellの基礎(3) モジュールと総合演習

ようやく第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

…それほど関数に分ける必要のある部分が無かったという罠。