之所以会出现上述的结果,是因为 interleave xforms 将 (map inc) 以及 (filter odd?) 和logs进行了交叉,得到的结果是 (comp (map inc) (log) (filter odd?) (log)) ,所以如果是偶数就会被filter清除,看不见log了。
首先一定得理解:每个tranducer函数都是同构的!

形式如下
(defn m [f]
(fn [rf]
(fn [result elem]
(rf result (f elem)))))
这意味着 (m f) 的函数都是可以组合的,组合的形式如下:
(comp (m f) (m1 f1) ...)
展开之后
((m f)
((m1 f1)
((m2 f2) ...)))
->
(fn [result elem]
(((m1 f1)
((m2 f2) ...)) result (f elem)))
所以可以看到第一个执行的一定是 comp 的首个 reducing function 参数。故:
xform 作为组合的前提
执行顺序从左到右;
+ 作为 reducing function 最后执行;
什么是 Monad 呢?A monad is just a monoid in the category of endofunctors.
Identity—For a monad m, m flatMap unit => m
Unit—For a monad m, unit(v) flatMap f => f(v)
Associativity—For a monad m, m flatMap g flatMap h => m flatMap {x => g(x) flatMap h}
// java8 实现的 9*9 乘法表
public class ListMonad<T>{
private List<T> elements;
private ListMonad(T elem) {
this.elements = singletonList(elem);
}
private ListMonad(List<T> elems) {
this.elements = elems;
}
public <U> ListMonad<U> flatmap(Function<T, ListMonad<U>> fn) {
List<U> newElements = new ArrayList<>();
this.elements.forEach(elem -> newElements.addAll(fn.apply(elem).elements));
return new ListMonad<>(newElements);
}
public <X> ListMonad<X> uint(X elem) {
return new ListMonad<>(elem);
}
public <U> ListMonad<U> apply(ListMonad<Function<T, U>> m) {
return m.flatmap(this::map);
}
public <U> ListMonad<U> map(Function<T, U> fn) {
return flatmap(t -> uint(fn.apply(t)));
}
public static void main(String[] args) {
ListMonad<Integer> m = new ListMonad<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
ListMonad<Integer> m1 = new ListMonad<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
ListMonad<Integer> list = m.apply(m1.map(x -> y -> x * y));
// [1...81]
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-83096-6.html
这人出道几年了
我们就不仅仅是丧失机遇的问题了
人家做生意上来先给你个大金戒指