ふつうのHaskellプログラミング 第2章
ふつうのHaskellプログラミング
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/10/05
- メディア: オンデマンド (ペーパーバック)
- この商品を含むブログを見る
噂のすごい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プログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/10/05
- メディア: オンデマンド (ペーパーバック)
- この商品を含むブログを見る