Home - kzono/study_haskell GitHub Wiki
ことのおこり
C++やJavaに関数型言語から役に立ちそうなものが取り入れられてきている。
- 型推論
- ラムダ式(無名関数・クロージャ)
- maybe(Haskell), either(scala), optional(C++)といったエラー処理機構
- collection に対する高階関数:map, reduce, fold, filter
関数型言語とは何か?どんな特徴があるのか、複数の関数型言語を学んで共通項を探してみたい。また、それぞれの言語の特徴を知りたい。 学ぶ言語は
- Haskell
- Scala
- elixir
- Rust
- typescript
python は Haskell からいろいろ取り入れているらしい。(リスト内法表記とか)
並行処理
「関数型言語はデータが immutable なので、マルチスレッドでデータ競合が起きない」は正しいのか? C/C++でマルチスレッドを正しく・効率よく動かすのはとても難しいこととされている。データ競合を避けるための排他処理などを適切に使うのが難しい。関数型言語を使うと、簡単に安全で効率的な並行処理プログラムを書くことができるのか?
- future/promise によるタスク間非同期通信
関数型言語の特徴
- 関数型プログラミングは宣言的プログラミング
- 参照透過性・関数に副作用がない
- データが不変(immutable)
Haskell の立ち位置
関数型言語の中でも「純粋」なのが Haskell らしい。「変数は全て imutable」を貫いているところが「純粋」たる所以らしい。 scala は val と var で immutable/mutable を使い分ける。Rust はデフォルトが immutable で、mut とつけると mutable になる。
Haskell の特徴
なんとなくわかっている項目として次のものがある。
- パターンマッチ
- 遅延評価
- 関数の部分適応
- 関数のカリー化
- forループがない(再帰)
どんなものか、は教科書でなんとなくわかるが、具体的にどんな時に使うのか、何がうれしいのか、よくわからない。(汗
以下のものは、教科書を読んでもそもそもどんなものかがよくわからない。当然何がうれしいのか、どんな時に使うのか、具体的なイメージがわかない。
- functor
- applicative functor
- monoid
- monad
- 関数コンビネータ