From 39f49cd0d334fa37c5cbd89261e55510911d64b4 Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Thu, 23 Jan 2020 15:44:29 +0100 Subject: [PATCH] Finito Capitolo 2 del libro --- functional-programming-java/pom.xml | 25 +++++----- .../src/main/java/org/gym/fp/fpjava/Main.java | 7 +++ .../org/gym/fp/fpjava/demo/FunctionDemo.java | 49 +++++++++++++++++++ .../gym/fp/fpjava/type/BinaryOperator.java | 4 ++ .../java/org/gym/fp/fpjava/type/Function.java | 49 +++++++++++++++++++ .../java/org/gym/fp/fpjava/type/Tuple.java | 11 +++++ 6 files changed, 133 insertions(+), 12 deletions(-) create mode 100644 functional-programming-java/src/main/java/org/gym/fp/fpjava/demo/FunctionDemo.java create mode 100644 functional-programming-java/src/main/java/org/gym/fp/fpjava/type/BinaryOperator.java create mode 100644 functional-programming-java/src/main/java/org/gym/fp/fpjava/type/Function.java create mode 100644 functional-programming-java/src/main/java/org/gym/fp/fpjava/type/Tuple.java diff --git a/functional-programming-java/pom.xml b/functional-programming-java/pom.xml index 46b2ac2..8e30f35 100644 --- a/functional-programming-java/pom.xml +++ b/functional-programming-java/pom.xml @@ -1,19 +1,20 @@ - 4.0.0 - functional-programming-java - jar + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + functional-programming-java + Questo modulo contiene gli esercizi e le prove dal libro "Functional Programmin in Java" + jar - - fpgym - org.gym.fp - 1.0 - + + fpgym + org.gym.fp + 1.0 + - - 8 + + 8 8 diff --git a/functional-programming-java/src/main/java/org/gym/fp/fpjava/Main.java b/functional-programming-java/src/main/java/org/gym/fp/fpjava/Main.java index c650a98..3e605fd 100644 --- a/functional-programming-java/src/main/java/org/gym/fp/fpjava/Main.java +++ b/functional-programming-java/src/main/java/org/gym/fp/fpjava/Main.java @@ -1,4 +1,11 @@ package org.gym.fp.fpjava; +import org.gym.fp.fpjava.demo.FunctionDemo; + public class Main { + + public static void main(String[] args) { + FunctionDemo.run(); + } + } diff --git a/functional-programming-java/src/main/java/org/gym/fp/fpjava/demo/FunctionDemo.java b/functional-programming-java/src/main/java/org/gym/fp/fpjava/demo/FunctionDemo.java new file mode 100644 index 0000000..15324f7 --- /dev/null +++ b/functional-programming-java/src/main/java/org/gym/fp/fpjava/demo/FunctionDemo.java @@ -0,0 +1,49 @@ +package org.gym.fp.fpjava.demo; + +import org.gym.fp.fpjava.type.BinaryOperator; +import org.gym.fp.fpjava.type.Function; +import org.gym.fp.fpjava.type.Tuple; + +public class FunctionDemo { + + // Es. 2.12 + public static final Function factorial = + n -> n <= 1 ? n : n * FunctionDemo.factorial.apply(n - 1); + + public static void run() { + // function composition + Function triple = n -> n * 3; + Function square = n -> n * n; + Function compose = square.compose(triple); + System.out.println(compose.apply(2)); + System.out.println(square.andThen(triple).apply(2)); + + // function currying + BinaryOperator add = x -> y -> x + y; + System.out.println(add.apply(3).apply(5)); + System.out.println(func().apply("ciao").apply("mondo").apply("questo").apply("currying")); + + // partial function + Function> addTax = x -> y -> y + y / 100 * x; + Function add9PercentTax = addTax.apply(9.0); + System.out.println(add9PercentTax.apply(90.0)); + + // recursive function + System.out.println(factorial.apply(5)); + } + + // ES. 2.9 + private static Function>>> func() { + return a -> b -> c -> d -> String.format("%s %s %s %s", a, b, c, d); + } + + // ES. 2.10 + private static Function> curry(Function, C> fn) { + return a -> b -> fn.apply(new Tuple<>(a, b)); + } + + // ES. 2.11 + private static Function> swap(Function> fn) { + return u -> t -> fn.apply(t).apply(u); + } +} diff --git a/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/BinaryOperator.java b/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/BinaryOperator.java new file mode 100644 index 0000000..fc582d0 --- /dev/null +++ b/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/BinaryOperator.java @@ -0,0 +1,4 @@ +package org.gym.fp.fpjava.type; + +public interface BinaryOperator extends Function> { +} diff --git a/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/Function.java b/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/Function.java new file mode 100644 index 0000000..be373fb --- /dev/null +++ b/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/Function.java @@ -0,0 +1,49 @@ +package org.gym.fp.fpjava.type; + +public interface Function { + U apply(T arg); + + default Function compose(Function f) { + return x -> apply(f.apply(x)); + } + + default Function andThen(Function f) { + return x -> f.apply(apply(x)); + } + + default Function partialA(T a, Function> f) { + return f.apply(a); + } + + default Function partialB(U b, Function> f) { + return a -> f.apply(a).apply(b); + } + + static Function identity() { + return x -> x; + } + + static Function compose(Function f, Function g) { + return x -> f.apply(g.apply(x)); + } + + static Function andThen(Function f, Function g) { + return x -> g.apply(f.apply(x)); + } + + static Function, Function, Function>> compose() { + return x -> y -> y.compose(x); + } + + static Function, Function, Function>> andThen() { + return x -> y -> y.andThen(x); + } + + static Function, Function, Function>> higherAndThen() { + return x -> y -> z -> y.apply(x.apply(z)); + } + + static Function, Function, Function>> higherCompose() { + return (Function x) -> (Function y) -> (T z) -> x.apply(y.apply(z)); + } +} diff --git a/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/Tuple.java b/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/Tuple.java new file mode 100644 index 0000000..4aa36d1 --- /dev/null +++ b/functional-programming-java/src/main/java/org/gym/fp/fpjava/type/Tuple.java @@ -0,0 +1,11 @@ +package org.gym.fp.fpjava.type; + +public class Tuple { + private final A _1; + private final B _2; + + public Tuple(A first, B second) { + this._1 = first; + this._2 = second; + } +}