『関数プログラミング実践入門』
https://gyazo.com/ae2751397d01d69555e650860741c8fe
めちゃくちゃ良い本mrsekut.icon
関数型言語入門者にオススメ
関数型言語と手続き型言語の発想の違いや特徴
関数型言語(Haskell)に備わっている基本的な機能についての紹介
関数型言語でのプログラミングの思考の流れ
知識がない状態でどうやってシンプルな実装をやっていくかが書かれている
これを知ると関数型言語以外の書き方も変わると思うmrsekut.icon
ただし、他の(関数型でない)言語との比較が特徴の本でもあるので、他の言語を知っている人じゃないと少しハードルがあるかもしれない
第0章 [入門]関数プログラミング ——「関数」の世界
関数型言語の最適化
数学的な性質を利用した最適化ができる
関数型言語と並行/並列プログラミング
関数型言語を採用するメリット
関数型言語を採用する説得材料を用意する時に参考になるmrsekut.icon
第1章 [比較で見えてくる]関数プログラミング
C/C++,Java,JavaScript,Ruby,Python,そしてHaskell
部品を組み合わせる
C, JS, hsの比較
Cは関数が第一級オブジェクトでないので、小さく作っても組み合わせづらい
文脈をプログラミングする
NULLの扱い
C++, Java, hsの比較
正しい並列計算パターン
C, hsの比較
副作用の扱いの強制
構造化データの取り扱い
Java, hsの比較
hsの記述が簡潔すぎる
型に性質を持たせる
Ruby, hsの比較
rubyは、classでエスケープされたことを表現できるものの、ハックできてしまう
文書をルール通りに生成する
Python, hsの比較
他言語と比較するとよりわかりやすい
Nginx用のConfモナドを定義する
第2章 型と値 ——「型」は,すべての基本である
Haskellの基本的な文法
第3章 関数 ——関数適用,関数合成,関数定義,再帰関数,高階関数
関数の基本的な概念について
Haskellに慣れてくると直接的に再帰関数を書くのは避けるようになる
うっかり停止しないものを定義してしまう危険性があるから
第4章 評価戦略 遅延評価と積極評価
最高の実行時エラー対策
これを遅延評価の良さというのはちょっと微妙な気もするmrsekut.icon
実際良さではあるけど
ちょっと変わった平均値の計算
code:hs
mean' xs =
let (res, len) = foldl (\(m, n) x -> (m + x/len, n+1)) (0, 0) xs
in res
走査回数が変わっているわけではない
第5章 モナド ——文脈を持つ計算を扱うための仕掛け
5.1 型クラスをもう一度 ——自分で作るという視点で
型クラスを定義する
型クラスのインスタンスを作る
型クラスインタフェースのデフォルト実装
[比較]他の言語の「あの機能」と「型クラス」
インタフェースの後付け
同じ型であることの保証
5.2 モナドの使い方 ——文脈をうまく扱うための型クラスインタフェース
文脈を持つ計算 ——モナドを使うモチベーション
どこかで失敗するかもしれない計算 ——Maybeモナド
複数の結果を持つ計算 ——リストモナド
同じ環境を参照する計算 ——((->) r)というモナド
型クラスとしてのモナド ——アクション,return(注意!),bind演算子
モナド則 ——インスタンスが満たすべき,3つの性質
「モナド則を満たしていないモナド型クラスのインスタンス」の例,
とHaskellでの注意点
do記法
do記法とモナド則
5.3 いろいろなモナド ——Identity,Maybe,リスト,Reader,Writer,State,IO ...
Identity ——文脈を持たない
Maybe ——失敗の可能性を持っている
現実世界と理想的な型の世界の接続と失敗
Reader ——参照できる環境を共有する
configを参照する処理
Writer ——主要な計算の横で,別の値も一直線に合成する
State ——状態の引き継ぎ
IO ——副作用を伴う
副作用を扱えるのに純粋と言える理由
5.4 他の言語におけるモナド ——モナドや,それに類する機能のサポート状況
他の関数型言語とモナド
命令型言語とモナド ——Javaのモナドとの比較
Optionalクラス
Streamクラス
メソッドチェインの弊害 ——do記法のありがたみ
副作用による汚染は防げない
5.5 Haskellプログラムのコンパイル ——コンパイルして,Hello, World!
「普通」の実行方法について ——コンパイルして実行する
5.6 まとめ
Column 関数型言語で飯を喰う
6章
シンボル列→シンボル、連長の列に変換する圧縮方法
可逆圧縮
例
AAABBCCCCAAA→A3B2C4A3
画像圧縮などに用いられる
BWTを組み合わせて利用したり。
数独ソルバの例、良すぎるmrsekut.icon
p.312
この本を見ずにこのぐらい書ける様になるとかなり良い
ネタバレなので見ないほうがいい
6.3 制約を設ける
hs版の完全Constructorのような
6.4 適切な処理を選ばせる ——型と型クラスを適切に利用し,型に制約を記憶させる
複数のエスケープ
変換履歴を持った文字列の型
変換されているかもしれない文字列のクラス
エスケープ方法の持つべき性質
各エスケープを定義する
モジュールを利用してみる
6.5 より複雑な制約を与える ——とても強力なロジックパズルの例
ロジックパズル ——3人の昼食
人間の推論
推論規則を型で表す
推論規則を使って答えを実装する
強力な型がインタフェース設計に与えた力
6.6 まとめ
第7章 Haskellによるプロダクト開発への道 ——パッケージとの付き合い方
7.1 パッケージの利用 ——パッケージシステムCabal Haskellのパッケージシステム
公開されているパッケージを探す ——Hackage
公開されているパッケージを利用する ——cabal編
パッケージのインストール
パッケージのアンインストール
パッケージを利用する
公開されているパッケージを利用する ——Cabal sandbox編
sandbox環境を使う
7.2 パッケージの作成 ——とりあえずパッケージングしておこう
cabalize ——パッケージング作業
サンプルパッケージの作成 ——FizzBuzzライブラリ
cabalizeする
オススメのディレクトリ構成
モジュールの作成と公開
ビルド
パッケージング
バージョニング
パッケージの作成方法
パッケージのアップロード,バージョンアップ
Column Hackageへ公開しよう
7.3 組織内開発パッケージの扱い ——工夫,あれこれ
Cabalを通した利用 ——一番単純な方法
Cabal sandboxを通した利用 ——パッケージデータベースを共有しない方法
組織内Hackageサーバの利用
パッケージを分けない
7.4 利用するパッケージの選定 ——依存関係地獄,選定の指針
依存関係地獄
Haskellにおける依存関係地獄
パッケージ選定上,有望な性質
コアに近いパッケージ
枯れたパッケージ
シンプルなパッケージ
依存関係が少ないパッケージ
Column 「バージョン上限」を設ける利点
依存関係が広いパッケージ
Column Cabal sandboxの光と影 ——「パッケージレベルでの組み合わせやすさ」は,いかに?
インタフェースが安定しているパッケージ
7.5 依存パッケージのバージョンコントロール ——パッケージごとにどのバージョンを選択するか
バージョンの選定および固定について
1 各OSのパッケージシステムに用意されているものを使う
1 Cabalでローリングアップデートポリシーを定めて
逐次更新していく
3 Stackageに用意されているものを使う
7.6 バージョン間差の吸収 ——バージョン間の差分の検出から
複数開発環境の共存
Dockerを使う
Stackを使う
CIサービスを使う
インタフェースが安定しないパッケージの扱い方
Column Stackage/Stackを使う上での注意
7.7 まとめ
Column HaskellでのWebアプリケーション作成 ——より一層,複雑な文脈を表現するモナドの必要性
第8章 各言語に見られる関数プログラミングの影響 ——Ruby,Python,Java,JavaScript,Go,Swift,Rust,C#,C++
8.1 変数を定数化できるか ——変更を抑止する
変数を定数修飾する
メソッドを定数修飾する
8.2 関数の扱いやすさ ——関数/ラムダ式,変数への代入,関数合成,部分適用,演算子
各言語における関数/ラムダ式
変数への代入
呼び出し方の差異 ——Rubyの例
[関数ではない点1]Pythonのラムダ式 ——参照する環境の影響
[関数ではない点2]Javaのラムダ式 ——定数制約の検査
[関数ではない点3]C++のラムダ式 ——キャプチャ
「関数」を定義するポイント
関数合成
部分適用
Rubyの部分適用
C++,Pythonの部分適用
Goの部分適用
演算子
Swiftの演算子定義 ——オペレータ関数
Rubyの演算子定義
8.3 データ型定義とパターンマッチ ——Rust,Swift
データ型定義とパターンマッチの例
網羅性検査
再帰的な構造
8.4 型システムの強化 ——静的型付けと型検査,型推論
静的型付けの導入
型推論の採用
8.5 リスト内包表記 ——Python,C#のLINQ
Pythonのリスト内包表記
C#のリスト内包表記 ——LINQ
8.6 モナド ——Java 8,Swift
Swiftのモナド相当のインタフェース
Column Python関数プログラミングHOWTO
Stateモナド相当の実装例
8.7 コンパイル時計算 ——C++テンプレート
C++テンプレートによる関数プログラミング
C++テンプレートによるデータ型定義
自然数
リスト
C++テンプレートによる関数定義
C++テンプレートの評価戦略
C++テンプレートの限界