シリーズのまとめ
このシリーズは、当初の予定よりも長くなってしまいました。最後までお付き合いいただき、ありがとうございます!
この議論が、map
やbind
といった様々な関数の変換について理解を深める上で、参考になったことを願っています。世界をまたぐ関数を取り扱う上での有用なテクニックも、少しは理解いただけたのではないでしょうか。
もしかしたら、m-wordの神秘性も、少しは解けたかもしれませんね。
これらの関数を自分のコードで使ってみたいと思った方は、その実装がいかに簡単かお分かりいただけたと思います。 sしかし、これらの関数やさらに多くの機能を含む優れたF#ユーティリティライブラリの使用も検討してみてください:
ExtCore (ソース, NuGet). ExtCoreはF#コアライブラリ(FSharp.Core)を拡張し、実用的なF#アプリケーションの構築をサポートすることを目的としています。 これらの拡張には、Array、List、Set、Mapなどのモジュールの追加関数、不変のIntSet、IntMap、LazyList、Queueコレクション、 様々なコンピュテーション式(ワークフロー)、 そして「ワークフローコレクション」(ワークフロー内でシームレスに動作するように適応されたコレクションモジュール)が含まれます。
FSharpx.Extras (ホームページ). FSharpx.ExtrasはFSharpxシリーズのライブラリの一部です。 いくつかの標準的なモナド(State、Reader、Writer、Either、Continuation、Distribution)、 アプリカティブファンクターによるバリデーション、flipのような一般的な関数、非同期プログラミングユーティリティ、 そしてC# - F#の相互運用を容易にする関数を実装しています。
たとえば、この投稿で実装したモナディックな走査List.traverseResultM
は、すでにExtCoreで
ここで利用可能です。
このシリーズが気に入った方は、「フランケンファンクター博士とモナド怪物」シリーズでStateモナドについての投稿や、 「鉄道指向プログラミング」というトークでEitherモナドについての説明もご覧いただけます。
最初に述べたように、これを書くことは私にとっても学習プロセスでした。 私も専門家ではありませんので、もし間違いを見つけられたら、ぜひご指摘ください。
ありがとうございました!
シリーズの内容
このシリーズで触れた様々な関数へのショートカットリストです:
- パート1:高次の世界への持ち上げ
- パート2:世界をまたぐ関数の合成方法
- パート3:コア関数の実際的な使い方
- パート4:リストと高次の値の混合
- パート5:すべてのテクニックを使用する実世界の例
- パート6:独自の高次の世界を設計する
- パート7:まとめ
付録:言及した演算子のリスト
関数型プログラミング言語は、オブジェクト指向言語と違って変わった演算子が多いことで知られています。 そこで、このシリーズで使用された演算子を、関連する議論へのリンクとともにドキュメント化することが役立つと考えました。
演算子 | 同等の関数 | 議論 |
---|---|---|
>> |
左から右への合成 | このシリーズの一部ではありませんが、ここで議論されています |
<< |
右から左への合成 | 上記と同様 |
|> |
左から右へのパイピング | 上記と同様 |
<| |
右から左へのパイピング | 上記と同様 |
<!> |
map |
ここで議論されています |
<$> |
map |
Haskellのmap演算子ですが、F#では有効な演算子ではないため、このシリーズでは<!> を使用しています。 |
<*> |
apply |
ここで議論されています |
<* |
- | 片側の結合子。ここで議論されています |
*> |
- | 片側の結合子。ここで議論されています |
>>= |
左から右へのbind |
ここで議論されています |
=<< |
右から左へのbind |
上記と同様 |
>=> |
左から右へのKleisli合成 | ここで議論されています |
<=< |
右から左へのKleisli合成 | 上記と同様 |
付録:補足文献
代替チュートリアル:
- You Could Have Invented Monads! (And Maybe You Already Have).
- Functors, Applicatives and Monads in pictures.
- Kleisli composition ? la Up-Goer Five. これはユーモアがあって面白いですよ。
- Eric LippertのC#におけるモナドのシリーズ.
学術的な方向け:
- Monads for Functional Programming (PDF), by Philip Wadler. 最初のモナド論文の1つです。
- Applicative Programming with Effects (PDF), by Conor McBride and Ross Paterson.
- The Essence of the Iterator Pattern (PDF), by Jeremy Gibbons and Bruno Oliveira.
F#の例:
- F# ExtCoreと FSharpx.Extrasには多くの有用なコードがあります。
- FSharpx.Asyncには
Async
用のmap
、apply
、liftN
(「Parallel」と呼ばれています)、bind
、その他の便利な拡張機能があります。 - アプリカティブはパーシングに非常に適しています。以下の投稿で説明されています: