我在玩功能性編程,特別是功能性Java。我已經成功實施了我的IO Monad版本,並且正在爲我的核心寫入IO操作。它基本上是將對象序列化爲Xml文件(對象類型擴展了自定義的XmlWritable接口)。範圍管理 - 狀態IO Monad?
不幸的是,爲了做到這一點,需要創建一個OutputStream實例和一個XmlSerializer實例。 OutputStream的範圍比XmlSerializer的範圍要寬,這意味着我能夠正確處理IO 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 ** **是國家單子,在一個更專門的形式 – jozefg
好吧,沒問題:)當你需要維持一些狀態跨Monadic函數時,它是一個常見的模式來傳遞元組? –
請允許我提出一個問題:你爲什麼用一種不太適合它的語言來做這件事?您可以使用Scala,Clojure或Frege編寫程序的功能部分。 – Ingo