【发布时间】:2014-02-08 06:19:52
【问题描述】:
在我四处声称我已经成功之前,我想问一下。请不要退缩,我想先在这里体验任何批评。
由于 Java 缺乏动态语言在传递任意参数方面的灵活性,我通过将所有可能的输入捆绑到一个类(人)中来进行补偿,该类形成了输入空间。函数在 monad 的帮助下将其映射到输出空间(Friends)。
我不是想解决一般情况,只是举个例子看看我是否理解设计模式。
monad(如果是这样的话)执行这些规则:一旦邀请被拒绝,或者出现错误,就没有进一步的处理。
抱歉,篇幅较长。毕竟是Java。为了节省空间,我采用了一些约定俗成的捷径。
这实际上是一个单子的例子吗? (封装在 Friends 类中)
public class Sample {
public static void main(String[] args) {
People people0 = new People("Bob", "Fred");
Friends friends0 = Friends.pipeline(people0, ToFromFunction.INVITE, ToFromFunction.ACCEPT);
System.err.println(friends0);
People people1 = new People("Bob", "Jenny");
Friends friends1 = Friends.pipeline(people1, ToFromFunction.INVITE, ToFromFunction.ACCEPT);
System.err.println(friends1);
People people2 = new People("Bob", "Fred");
Friends friends2 = Friends.pipeline(people2, ToFromFunction.INVITE, ToFromFunction.BLOCK);
System.err.println(friends2);
}
}
/** this is the space of all inputs */
public class People {
public People(String from, String to) {
this.from = from;
this.to = to;
}
public String from;
public String to;
}
/** this is the output space, and the monad (?) */
public class Friends {
public boolean friends = false;
public boolean rejected = false;
public String errors = "";
public static Friends unit(People from) {
return new Friends();
}
public Friends bind(ToFromFunction f, People from) {
if (! errors.isEmpty()) {
// we have errors; skip the rest
return this;
}
if (rejected) {
// No means no
return this;
}
return f.act(from, this);
}
public static Friends pipeline(People from, ToFromFunction... functions) {
Friends result = Friends.unit(from);
for (ToFromFunction f : functions) {
result = result.bind(f, from);
}
return result;
}
}
/** functions from People to Friends */
public interface ToFromFunction {
Friends act(People from, Friends to);
ToFromFunction INVITE = new ToFromFunction() {
public Friends act(People from, Friends to) {
// Jenny has blocked Bob
if ("Jenny".equals(from.to) && "Bob".equals(from.from)) {
to.errors = "Jenny blocked Bob";
}
return to;
}
};
ToFromFunction ACCEPT = new ToFromFunction() {
public Friends act(People from, Friends to) {
// Good to go!
to.friends = true;
return to;
}
};
ToFromFunction BLOCK = new ToFromFunction() {
public Friends act(People from, Friends to) {
to.friends = false;
to.rejected = true;
return to;
}
};
}
【问题讨论】:
-
你在@BrianGordon 有什么收获?这些是针对程序员的主题指南,而不是 Stack Overflow。
-
@Makoto 对不起,我是说这对程序员来说是一个合适的问题。它不适合 StackOverflow。
-
真正的问题是什么?
-
"这实际上是一个单子的例子吗?" ——原来的帖子最后有点落后了。编辑澄清这一点,谢谢!