我正在玩函数式编程,尤其是函数式 Java。我已经成功实现了我的 IO Monad 版本,并且正在为我的核心编写 IO 操作。它基本上是将对象序列化为 Xml 文件(对象类型扩展了自定义 XmlWritable 接口)。
不幸的是,为了做到这一点,需要创建一个 OutputStream 实例和一个 XmlSerializer 实例。OutputStream 的范围比 XmlSerializer 的范围更广,这意味着我认为能够在我的 IO monad 中正确处理这两个生命周期的唯一方法是将它们放在一个元组中,在使用 XmlSerializer 编写后关闭 OutputStream .
这会导致代码繁重而丑陋(Java 6 绝对不是最好的):
public abstract class IO<R> {
[...]
}
public class IOActions {
public final F<String, IO<OutputStream>> openFileFn() {
return new F<String, IO<OutputStream>>() {
@Override
public IO<OutputStream> f(String fileName) {
[...]
}
};
}
/* This will be partially applied, encoding will be fixed */
public static final F<OutputStream, IO<P2<OutputStream, XmlSerializer>>> initSerializer() {
return new F<OutputStream, IO<P2<OutputStream, XmlSerializer>>>() {
@Override
public IO<P2<OutputStream, XmlSerializer>> f(OutputStream os) {
XmlSerializer = new ...
[...]
}
};
}
/* This will be partially applied as well */
public static final F2<XmlWritable, P2<OutputStream, XmlSerializer>, IO<P2<OutputStream, XmlSerializer>>> writeObjectFn() {
return new F2<XmlWritable, P2<OutputStream, XmlSerializer>, IO<P2<OutputStream, XmlSerializer>>>() {
@Override
public IO<P2<OutputStream, XmlSerializer>> f(XmlWritable object, P2<OutputStream, XmlSerializer> p) {
[...]
}
};
}
有没有更惯用的为什么要在函数式编程中处理我的用例?
潜伏着,我发现了 State Monad……但我有点害怕看到如果我在函数式 Java 中的 IO Monad 之上应用 State Monad 会发生什么。