垂れ流す思考

思考を垂れ流しアウトプットを行うブログ

ふつうのHaskellプログラミング 第2章

ふつうのHaskellプログラミング

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

噂のすごいH本を読んで楽しくHaskellを学んでいこうというコンセプト

会社のHaskellerさんに
「関数型素人がすごいH本で入門すると中盤で詰むよ」
「初めてならふつうのH本からがおすすめ」
ということなので『ふつうのHaskellプログラミング』からやっていこうかと。

第2章 Haskellの基礎(1)関数とリスト

第2章から第4章まではUNIXコマンドをHaskellで実装するというコンセプト
結構わかりやすいな〜って印象。

第2章で実装するコマンドは以下

コマンド名 効果
cat 標準入力から読んで標準出力に書く
countline 入力の行数を数える
head 入力の最初の数行だけを出力する
tail 入力の最後の数行だけを出力する

適用する(apply)

putStrLn "Hello World!"

上記はputStrLn関数の引数に"Hello World!"を指定した形。
RubyとかだとputStrLnメソッドに"Hello World!"を渡して呼ぶとか言ったりしますが、
Hakellだと"Hello World!"putStrLn関数を適用する(apply)という言うらしい。ちょっとかっこいい。

束縛する(bind)

Haskellは変数の再代入ができません。
と言うよりHaskellを使うと変数とか全然使わなくなると聞きました。
その辺は後々わかっていくと思いますが、変数の初期化しかしないため、代入するとは言わずに
「変数を値に束縛する(bind)」と言うらしい。

再代入できないので変数に固定しているみたいなイメージですかね。
注意書きに
◎「変数値に束縛する」
✖️「変数値を束縛する」

らしい。結構細かいけど重要なことなのでしょう。

束縛している方向  
変数 -> 値   # OK
値   -> 変数 # NO

値がメインと言うことかな。

リスト

Haskellの文字列はリストと同列です。

Haskellは一文字(Char)を'c'のシングルクオートで表し、
文字列を"char"のダブルクオートで表す。
"char" = ['c', 'h', 'a', 'r']と言う意味。

リストとか配列とかは言語によって意味が変わるんだよね。
Hakellのリストでは同じ型しか格納できない。

第2章はまだ難しく感じなかった。
ただ簡単なコードですら新鮮に感じるので自分も関数型脳を鍛えて行かなきゃな〜

main = do cs <- getContents
          putStr $ lastNLines 10 cs

lastNLines n cs = unlines $ takeLast n $ lines cs

takeLast n ss = reverse $ take n $ reverse ss

これはtailコマンドの実装
$は括弧の省略

main = do cs <- getContents
          putStr ( lastNLines 10 cs )

lastNLines n cs = unlines ( takeLast n ( lines cs ))

takeLast n ss = reverse ( take n ( reverse ss ))

こんな意味

takeLast関数は逆順で文字列を受け取り、n行取り出して、また逆順でリストにして返す。
こう言う考え方をパッとできるようになるにはやっぱり関数脳が足りないよね。
複数の関数を組み立てて処理を考える思考を身につけよう。

今日は終わり

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門