Java 8 にはラムダがあります。モナドはまったく別の話です。それらを関数型プログラミングで説明するのは十分に困難です (Haskell と Scala の主題に関するチュートリアルが多数あることからも明らかです)。
モナドは、静的に型付けされた関数型言語の典型的な機能です。オブジェクト指向で説明すると、Monad
インターフェイスを想像できます。Monad
実装するクラスは、実装を実装Monad
する際に「モナドの法則」として知られているものに従う場合、「モナド」と呼ばれます。次に、この言語は、クラスのインスタンスの操作を興味深いものにする構文糖衣を提供します。Monad
Java ではモナドIterable
とは何の関係もありませんが、Java コンパイラが特別に扱う型 ( foreach
Java 5 に付属する構文) の例として、次のことを考慮してください。
Iterable<Something> things = getThings(..);
for (Something s: things) { /* do something with s */ }
したがって、古いスタイルのループでIterable
のIterator
メソッド (および会社) を使用することもできましたが、Java では、この構文糖衣を特別なケースとして認めています。hasNext
for
したがって、実装Iterable
し、法則Iterator
に従わなければならないクラス (例:次の要素がない場合は返さなければならない) が構文で役立つように、対応する表記法 (Haskell で呼び出されるように)で役立ついくつかのモナドクラス が存在します。 ) または Scala の表記。Iterator
hasNext
false
foreach
do
for
そう -
- モナドクラスの良い例は何ですか?
- それらを処理するための構文糖衣はどのようになりますか?
Java 8 ではわかりません。ラムダ表記については知っていますが、他の特別な構文糖衣については知らないので、別の言語で例を挙げなければなりません。
多くの場合、モナドはコンテナークラスとして機能します (リストはその例です)。Javajava.util.List
にはすでに明らかにモナドではないものがありますが、Scala のものは次のとおりです。
val nums = List(1, 2, 3, 4)
val strs = List("hello", "hola")
val result = for { // Iterate both lists, return a resulting list that contains
// pairs of (Int, String) s.t the string size is same as the num.
n <- nums
s <- strs if n == s.length
} yield (n, s)
// result will be List((4, "hola"))
// A list of exactly one element, the pair (4, "hola")
これは(大まかに)次の構文糖衣です。
val nums = List(1, 2, 3, 4)
val strs = List("hello", "hola")
val results =
nums.flatMap( n =>
strs.filter(s => s.size == n). // same as the 'if'
map(s => (n, s)) // Same as the 'yield'
)
// flatMap takes a lambda as an argument, as do filter and map
//
これは、モナドを利用してリスト内包表記を提供する Scala の機能を示しています。
したがって、List
Scala の a はモナドです。これは、Scala のモナドの法則に従っているためです。この法則は、すべてのモナドの実装が適合するflatMap
,map
およびfilter
メソッドを持たなければならないことを規定しています (この法則に興味がある場合は、「Monads are Elephants」ブログ エントリに最適な説明があります。これまでに発見されました)。そして、ご覧のとおり、ラムダ (および HoF) は絶対に必要ですが、この種のものを実用的な方法で使用するには十分ではありません。
コンテナっぽいもの以外にも、便利なモナドがたくさんあります。それらにはあらゆる種類のアプリケーションがあります。私のお気に入りはOption
、Scala のモナド (Haskell のモナド) です。これは、 null 安全性Maybe
をもたらすラッパー型です: モナドの Scala API ページには、非常に単純な使用例があります: http://www.scala-lang. org/api/current/scala/Option.html
Haskell では、非モナド Haskell コードの実行順序が不確定であるという事実を回避する方法として、モナドは IO を表すのに役立ちます。Option
ラムダを持つことは、関数型プログラミングの世界への最初の小さな一歩です。モナドには、モナド規約と、使用可能なモナド型の十分な大きさのセットの両方が必要です。また、モナドを楽しく便利に扱うための構文糖衣も必要です。
Scala はほぼ間違いなく Java に最も近い言語であり、(モナディックな) 関数型プログラミングも可能です。(まだ) 興味がある場合は、Scala の Monad チュートリアルをご覧ください:
http://james-iry.blogspot.jp/2007/09/ monads-are-elephants-part-1.html
大雑把にグーグルで調べると、Java でこれを行う試みが少なくとも 1 回あることがわかります: https://github.com/RichardWarburton/Monads-in-Java -
悲しいことに、Java でモナドを説明することは (ラムダ式であっても)、本格的なオブジェクト指向プログラミングを ANSI C (C++ や Java ではなく) で説明するのと同じくらい難しいです。