算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

Java8でカリー化

完全におもちゃです。

使いたくなる場面はないでしょう。

いきなり全コード↓

package sample;

import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Function;

public class Main {

    /** 2引数関数のカリー化 */
    static <T, U, R> Function<T, Function<U, R>> curried(BiFunction<T, U, R> biFunction) {
        return (t) -> (u) -> biFunction.apply(t, u);
    }

    /** 2つの引数の引き算 */
    static int sub(int a, int b) {
        return a - b;
    }

    /** Optionalの便利な適用 */
    static <A, B> Optional<B> apply(Optional<Function<A, B>> func, Optional<A> param) {
        return param.flatMap((p) -> func.map((f) -> f.apply(p)));
    }

    public static void main(String[] args) {
        Function<Integer, Function<Integer, Integer>> sub = curried(Main::sub);

        Optional<Integer> a = Optional.of(7);
        Optional<Integer> b = Optional.of(3);
        Optional<Integer> c = Optional.empty();

        Optional<Integer> x = apply(apply(Optional.of(sub), a), b);
        Optional<Integer> y = apply(apply(Optional.of(sub), a), c);
        Optional<Integer> z = apply(apply(Optional.empty(), a), b);

        System.out.println(x); // => Optional[4]
        System.out.println(y); // => Optional.empty
        System.out.println(z); // => Optional.empty
    }
}

う...変数初期化左辺の型推論欲しい。

curriedがカリー化する関数です。 2引数関数として標準ライブラリに用意されているBiFunctionを引数に取って、Functionを返すFunctionを返しています。

applyは「Optionalの便利な適用」ができる関数です。

で、これを使ってOptionalな値を、素の引数を取るsubに食わせてます。

以上