もっと Lambda その6
今日はとても感動した記事があったので紹介します。
なんと日本語です!
ちょっとおまじないの部分は私にとっては呪いの呪文のようにもとれました。(>_<。)
この記事の中でカリー化という技法が紹介されてました。
私はこの技法は初めてなので少し調べてみました。
Wikipedia では次のように解説されてました。
カリー化 (currying) とは、計算機科学分野の技法の一つ。複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。
この技法は、クリストファー・ストレイチーにより論理学者ハスケル・カリーに因んで名付けられたが、実際に考案したのは Moses Schönfinkel とゴットロープ・フレーゲである。
f( a, b ) = c という関数 f があるときに、F( a ) = g ただし、g( b ) = c という関数 g が得られる関数 F を定義した場合、F は、f をカリー化したものである。
といことで自分でも試してみたくなりました。
決して疑ってる訳ではありません。新しい未知なるものへのあくなき好奇心からです。
ついでに、甘えと言っていた部分も自分なりに考えてみました。
いつものように未熟なコードですが以下のようにプログラムを組んでみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package jp.yucchi.javacurry; import java.util.function.Function; import java.util.function.BiFunction; public class JavaCurry { public static void main(String[] args) { Function<String, Function<String, String>> house = java -> curry -> java + curry; System.out.println(house.apply("ジャワ").apply("カレー")); BiFunction<String, String, String> h = (java, curry) -> java + curry; System.out.println(h.apply("ジャワ", "カレー")); Function<String, Function<String, Function<String, String>>> house2 = java -> curry -> level -> java + curry + level; System.out.println(house2.apply("ジャワ").apply("カレー").apply("甘口")); Function<String,BiFunction<String, String, String>> h2 = java -> (curry, level) -> java +curry + level; System.out.println(h2.apply("ジャワ").apply("カレー","辛口")); } } |
実行結果は期待通りに次のようになりました。
ジャワカレー
ジャワカレー
ジャワカレー甘口
ジャワカレー辛口
java.util.function.BiFunction を使ってみました。
引数が多くなったときの正しい処理が解らないので適当にしたら期待通りの結果となってしまいました。
間違っている、もしくは正しい方法があるのならご教示いただければ幸いです。
そう言えば、昔 JavaHouse 高木浩光さんのホームページに Java は ジャワカレーとは関係ないという注意書きがあったような気がします。
とてもまじめそうで冗談一つ言わなそうな雰囲気を醸し出していたのでそれがジョークなのか本気なにか聞きたかった覚えがあります。
どうでもいいことだけど
思いっきり思い出した(×_×)
JavaDoc をサラッといっときましょうか。
Function
@FunctionalInterface
public interface Function<T,R>
Apply a function to the input argument, yielding an appropriate result. A function may variously provide a mapping between types, object instances or keys and values or any other form of transformation upon the input.
パラメータ:
T
– the type of the input to theapply
operationR
– the type of the result of theapply
operation
日付:
1.8
apply()
java.util.function.Function
public R apply(T t)
Compute the result of applying the function to the input argument
パラメータ:
t
– the input object
戻り値:
the function result
BiFunction
@FunctionalInterface
public interface BiFunction<T,U,R>
Apply a function to the input arguments, yielding an appropriate result. This is the two-arity specialization of Function
. A function may variously provide a mapping between types, object instances or keys and values or any other form of transformation upon the input.
パラメータ:
T
– the type of the first argument to theapply
operationU
– the type of the second argument to theapply
operationR
– the type of results returned by theapply
operation
日付:
1.8
それでは、お約束の時間です。
この「もっと Lambda 」シリーズは、インターネット上で得た情報を元にそれを少し変更しているだけです。
よって私の推測で解釈された内容が部分的にありますので間違いがあると思います。
Java8 もまだ build86 を使用していますので API の変更により記述方法が変わるかもしれません。
早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。
TAGS: Java | 2013年5月1日9:02 PM | Comment : 0