[解決済み] Java 8でモナドを使う
質問
モナドとは何かということを理解するために、どなたかJavaを使った例を示していただけませんか?それらは可能ですか?
ラムダ式は、プレリリースされたラムダ互換のJDK8をここからダウンロードすれば、javaで可能です。 http://jdk8.java.net/lambda/
このJDKを使ったラムダの例を以下に示しますが、誰か比較的にシンプルなモナドを提供してくれませんか?
public interface TransformService {
int[] transform(List<Integer> inputs);
}
public static void main(String ars[]) {
TransformService transformService = (inputs) -> {
int[] ints = new int[inputs.size()];
int i = 0;
for (Integer element : inputs) {
ints[i] = element;
}
return ints;
};
List<Integer> inputs = new ArrayList<Integer>(5) {{
add(10);
add(10);
}};
int[] results = transformService.transform(inputs);
}
どのように解決するのですか?
ご参考までに。
提案された JDK8 オプション クラス を満たします。 という3つの モナドの法則 . ここでは を実演している要点です。 を示します。
モナドに必要なのは になります。 に準拠した関数を提供することです。 3つの の法則に従うものである。
つの機能。
-
を配置する。 の値をモナド文脈に置く
-
HaskellのMaybe。
return
/Just
-
Scalaのオプションです。
Some
-
Functional Java のオプションです。
Option.some
-
JDK8 のオプション。
Optional.of
-
HaskellのMaybe。
-
を適用する 関数をモナド文脈で適用する
-
HaskellのMaybe。
>>=
(別名bind
) -
Scalaのオプションです。
flatMap
-
Functional Java のオプションです。
flatMap
-
JDK8 のオプション。
flatMap
-
HaskellのMaybe。
をご覧ください。 上記の gist をご覧ください。
注:理解すべき重要なことのひとつは、署名の 関数がモナド文脈で適用されること : それは生の値型を取り、モナド型を返します。
言い換えれば、もしあなたが
Optional<Integer>
のインスタンスがある場合、そのインスタンスに渡すことのできる関数は
flatMap
メソッドに渡すことができる関数は、シグネチャが
(Integer) -> Optional<U>
ここで
U
は値の型であり、必ずしも
Integer
である必要はなく、例えば
String
:
Optional<Integer> maybeInteger = Optional.of(1);
// Function that takes Integer and returns Optional<Integer>
Optional<Integer> maybePlusOne = maybeInteger.flatMap(n -> Optional.of(n + 1));
// Function that takes Integer and returns Optional<String>
Optional<String> maybeString = maybePlusOne.flatMap(n -> Optional.of(n.toString));
この方法でコーディングしたり、この方法で考えたりするために、モナド・インターフェースのようなものは必要ないのです。Scalaでは、(Scalazライブラリを使っていない限り)Monad Interfaceに対してコードを書くことはありません。JDK8 では、Java の人たちがこのスタイルの 連鎖したモナド計算 も使えるようになるようです。
お役に立てれば幸いです。
更新しました。 この件に関するブログ ここで .
関連
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
セミコロン期待値エラー解決
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
シェルコマンドやスクリプトのJavaコール
-
ジャバアレイ
-
FindBugの使用概要
-
アノテーション「@Retention」の役割
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
java 365*1000*60*60*24 計算問題
-
[解決済み] scalaのslickメソッド、今ひとつ理解できない。