【发布时间】:2013-11-09 03:48:28
【问题描述】:
我正在玩函数式编程,尤其是函数式 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 会发生什么。
【问题讨论】:
-
我现在正在阅读您的代码(抱歉,Java 6 对 FP 来说很痛苦),但是 IO 是状态单子,以更专业的形式跨度>
-
好的,没问题 :) 当您需要跨 Monadic 函数维护某些状态时,传递元组是一种常见的模式吗?
-
请允许我问一个问题:您为什么要用一种不太适合它的语言来做这些事情?您可以使用 Scala、Clojure 或 Frege 来编写程序的功能部分。
-
你的问题确实很好:) 不幸的是我有这个限制。但我知道 Scala,所以任何 Scala 的答案都可以接受!谢谢!
-
约束到底是什么?使用“函数式java库”,还是生成java代码?
标签: java functional-programming functional-java