kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Grokking Simplicity

ざっと読んでみてこれはもしかしてすごいいい本なのでは?と思ったので紹介

関数型プログラミング入門なんですが
タイトルだけ見てもそういう本だってわからないので気づかない人もいるだろう、
英語で出版されたばかりの本なので日本語版はないんだけど日本語訳も出てほしいし
なんとか広まってくれないかな、と

関数型プログラミングの本もいろいろ出てますが理論に寄った感じの本が多くて
関数型プログラミングの雰囲気はなんとなくわかった気がする、
でも実際に書くとどんな感じ?みたいなステータスだったんですが
この本は逆に、実際に何か作るにはどうするとよいか、という視点で書かれてます
モナドも圏も出てきません(たぶん

ということで関数型プログラミングってどんなん?と
興味を持って調べ始めたくらいの人にはどんぴしゃかなと
けっこう発展的なところまでカバーしてる気がするので
そこそこやってる人が基本から復習するのにもよさそう(しらんけど
逆に関数型でバリバリやっているひとから見た感想なんかも聞いてみたい

この本に出てくるコードはJavaScriptですが、内容は言語からは独立してて
基本的にはJavaScriptならではという技術は出てきません
作者はClojureを教えるのが仕事だしHaskellも書けるけどあえてJavaScriptにしてるのは

というスタンス

内容をざっくり紹介

副作用の範囲をコントロールする

関数型プログラミングでは副作用を使わない、というのはウソ
まずはプログラムをAction、Calculation、Dataの三つの部分に分類
Actionが副作用ありの関数、Calculationっていうのが副作用なしの関数
Actionはいつ呼ぶか、何度呼ぶかで結果が変わる
Calculationはいつ呼んでも何度呼んでも結果は同じ
関数がActionかCalculationか見分けたりActionからCalculationを切り出したりを
実際に使う場面を想定した短いコードをサンプルにしてしばらく練習
これ以後も常にサンプルをいじりながら説明が進む

ミュータブルな言語でイミュータブルなプログラムを書くには

ActionをReadとWriteに分ける
Copy-on-writeとShallow Copy
Shallow Copyは遅くない
Copy-on-readとDeep Copy
イミュータブルかわからないライブラリなどを使うときはReadのときもガードをかける

抽象化の壁(Abstraction Barrier)と関数の階層設計(Stratified Design)

関数の呼び出し関係を図に描いてレイヤーを作ってみる
少ないインタフェースかつレイヤーを飛び越えるような呼び出しが
なくなるように整理していくと細部を抽象化したレイヤーができる
下位のレイヤーほど変更の頻度が少なく、一般的で、再利用性が高い

ファーストクラス関数

ファーストクラス関数を使って関数の再利用性を高める
map、filter、reduceでforループを書き直す
関数をつなげる

タイムライン

いろんな処理が並行で走るプログラムの動作をタイムラインを描いて整理する
タイミングで発生するバグとその防ぎ方
自分でキューを書いてみる

リアクティブアーキテクチャ

何かが変化すると関連する値も自動的に変化する
自分でリアクティブなコードを書いてみる
原因(cause)と結果(effect)を分離することでタイムラインを柔軟に構成する

オニオンアーキテクチャ

階層設計の発展形
従来のWebプログラムはUI→ドメイン→データベースという階層が一般的
データベースが基礎にあるため全体がActionになってしまう
オニオンアーキテクチャーではプログラムを言語のレイヤー、ドメインのレイヤー、
相互作用(Interaction)のレイヤーに分ける
プログラム外部とのやり取り(つまりAction)はすべて相互作用レイヤーのみで行う
関数の呼び出しは相互作用レイヤー→ドメインレイヤー→言語レイヤー

この本を読んだら

技術を習得・定着させるにはSandbox、Production両面で
関数型でないProductionのコードも少しずつ関数型にしていくことができる
ミュータブルな変数をひとつ減らせばバグの元がひとつ減る
ActionからCalculationを切り出すとかforループを置き換えるとか

といったところ
ForewordはGuy Steeleが書いてるしTwitterでGene Kimがほめてたしきっといい本なので
ぜひ読んでみていただければと

作者はPodcastでもしゃべってるのでそっち聞いても雰囲気がわかるかも
ただし入門向けに整理されたりはしてません
(あと最初のほうは録音がひどい)
(今なら本が50%Offって出てた)

lispcast.com

最近はDynalistの方で書いています

どこまでできるか試すという感じで今は若干無理をしつつ全部Dynalistに書いています

📝 kb84tkhrの公開ログ - Dynalist

📝 kb84tkhrの公開メモ - Dynalist

公開ログの方は時系列で何でも書くところ(ここと同じ位置づけ)
公開メモの方はある程度整理して残すところ(Kobe's Public Scrapbox的なもの)

無理をしつつと書きましたが
全部ひとつにまとまってるというのはけっこう大きなメリットと感じてます

Reasoned Schemer (110) condu、onceo

condaは成功した節で止まってくれるとはいえ成功した節から帰ってこなくては無力

> (run* q (conda ((alwayso) succeed) (succeed fail)))
(no value)

run 1なら帰ってくる

> (run 1 q (conda ((alwayso) succeed) (succeed fail)))
'(_0)

そこでconduの登場
conduは一度questionが成功したらそれで終わり 帰ってくる

続きを読む

Reasoned Schemer (109) conda

なんだか/oで完結したみたいな気分になってましたが
ここで少し流れが変わってcondaconduが登場
ここらへん、“The Second Commandment”が何を言っているのかよくわからなかった記憶
ひさしぶりに処理系の中身と関連付けながら見ていく
こんどはわかるかな

続きを読む