Skip to content

Commit e5da83a

Browse files
committed
Monad#zip default implementation sequences in reverse (better) order
1 parent cbac3f5 commit e5da83a

9 files changed

Lines changed: 9 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
77
### Changed
88
- ***Breaking Change***: `Sequence` now has two more type parameters to aid in inference
99
- ***Breaking Change***: `Traversable#traverse` now has three more type parameters to aid in inference
10+
- ***Breaking Change***: `Monad#zip` now forces `m a -> b` before `m a` in default `Applicative#zip` implementation; this is only breaking for types that are sensitive to computation order (the resulting values are the same)
1011
- `Bifunctor` is now a `BoundedBifunctor` where both parameter upper bounds are `Object`
1112
- `Peek2` now accepts the more general `BoundedBifunctor`
1213
- `Identity`, `Compose`, and `Const` functors all have better `toString` implementations

src/main/java/com/jnape/palatable/lambda/functor/Applicative.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ default <B> Applicative<B, App> fmap(Function<? super A, ? extends B> fn) {
6161
* @return appB
6262
*/
6363
default <B> Applicative<B, App> discardL(Applicative<B, App> appB) {
64-
return appB.zip(zip(pure(constantly(id()))));
64+
return appB.zip(fmap(constantly(id())));
6565
}
6666

6767
/**

src/main/java/com/jnape/palatable/lambda/monad/Monad.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
import java.util.function.Function;
66

7-
import static com.jnape.palatable.lambda.functions.builtin.fn1.Id.id;
8-
97
/**
108
* Monads are {@link Applicative} functors that support a flattening operation to unwrap <code>M&lt;M&lt;A&gt;&gt;
119
* -&gt; M&lt;A&gt;</code>. This flattening operation, coupled with {@link Applicative#zip(Applicative)}, gives rise to
@@ -55,7 +53,7 @@ default <B> Monad<B, M> fmap(Function<? super A, ? extends B> fn) {
5553
*/
5654
@Override
5755
default <B> Monad<B, M> zip(Applicative<Function<? super A, ? extends B>, M> appFn) {
58-
return fmap(a -> appFn.<Monad<Function<? super A, ? extends B>, M>>coerce().<B>fmap(f -> f.apply(a))).flatMap(id());
56+
return appFn.<Monad<Function<? super A, ? extends B>, M>>coerce().flatMap(ab -> fmap(ab::apply));
5957
}
6058

6159
/**

src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple2Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void staticFactoryMethodFromMapEntry() {
105105
public void zipPrecedence() {
106106
Tuple2<String, Integer> a = tuple("foo", 1);
107107
Tuple2<String, Function<? super Integer, ? extends Integer>> b = tuple("bar", x -> x + 1);
108-
assertEquals(tuple("foo", 2), a.zip(b));
108+
assertEquals(tuple("bar", 2), a.zip(b));
109109
}
110110

111111
@Test

src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple5Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void fill() {
9292
public void zipPrecedence() {
9393
Tuple5<String, Integer, Integer, Integer, Integer> a = tuple("foo", 1, 2, 3, 4);
9494
Tuple5<String, Integer, Integer, Integer, Function<? super Integer, ? extends Integer>> b = tuple("bar", 2, 3, 4, x -> x + 1);
95-
assertEquals(tuple("foo", 1, 2, 3, 5), a.zip(b));
95+
assertEquals(tuple("bar", 2, 3, 4, 5), a.zip(b));
9696
}
9797

9898
@Test

src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple6Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public void fill() {
9696
public void zipPrecedence() {
9797
Tuple6<String, Integer, Integer, Integer, Integer, Integer> a = tuple("foo", 1, 2, 3, 4, 5);
9898
Tuple6<String, Integer, Integer, Integer, Integer, Function<? super Integer, ? extends Integer>> b = tuple("bar", 2, 3, 4, 5, x -> x + 1);
99-
assertEquals(tuple("foo", 1, 2, 3, 4, 6), a.zip(b));
99+
assertEquals(tuple("bar", 2, 3, 4, 5, 6), a.zip(b));
100100
}
101101

102102
@Test

src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple7Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void into() {
9999
public void zipPrecedence() {
100100
Tuple7<String, Integer, Integer, Integer, Integer, Integer, Integer> a = tuple("foo", 1, 2, 3, 4, 5, 6);
101101
Tuple7<String, Integer, Integer, Integer, Integer, Integer, Function<? super Integer, ? extends Integer>> b = tuple("bar", 2, 3, 4, 5, 6, x -> x + 1);
102-
assertEquals(tuple("foo", 1, 2, 3, 4, 5, 7), a.zip(b));
102+
assertEquals(tuple("bar", 2, 3, 4, 5, 6, 7), a.zip(b));
103103
}
104104

105105
@Test

src/test/java/com/jnape/palatable/lambda/adt/hlist/Tuple8Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public void into() {
102102
public void zipPrecedence() {
103103
Tuple8<String, Integer, Integer, Integer, Integer, Integer, Integer, Integer> a = tuple("foo", 1, 2, 3, 4, 5, 6, 7);
104104
Tuple8<String, Integer, Integer, Integer, Integer, Integer, Integer, Function<? super Integer, ? extends Integer>> b = tuple("bar", 2, 3, 4, 5, 6, 7, x -> x + 1);
105-
assertEquals(tuple("foo", 1, 2, 3, 4, 5, 6, 8), a.zip(b));
105+
assertEquals(tuple("bar", 2, 3, 4, 5, 6, 7, 8), a.zip(b));
106106
}
107107

108108
@Test

src/test/java/com/jnape/palatable/lambda/functions/builtin/fn3/LiftA2Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class LiftA2Test {
1616
public void liftsAndAppliesDyadicFunctionToTwoApplicatives() {
1717
BiFunction<Integer, Integer, Integer> add = (x, y) -> x + y;
1818
assertEquals(right(3), liftA2(add, right(1), right(2)).coerce());
19-
assertEquals(tuple(2, 5), liftA2(add, tuple(1, 2), tuple(2, 3)).coerce());
19+
assertEquals(tuple(1, 5), liftA2(add, tuple(1, 2), tuple(2, 3)).coerce());
2020
assertEquals(new Identity<>(3), liftA2(add, new Identity<>(1), new Identity<>(2)));
2121
}
2222
}

0 commit comments

Comments
 (0)