Tin*_*uSa 2 java oop haskell functional-programming clojure
在过去的几个月里,我尝试使用函数式编程范例进行编码.现在我有一个OOP解决方案,我正在尝试找到一个功能性解决方案.
问题很简单.我有一个算法,它产生两个不同的数组作为结果(a和b).现在,我想检查结果有多好.因此,我为他们写了几个评估标准.我希望伪java源代码对你没问题!
// first the Algorithm class
class Algorithm {
private []a;
private []b;
Algorithm(input) {
computeResult();
}
getA(){return a;}
getB(){return b;}
void computeResult() {
...
... // time-consuming operations
... // set values for a and b
...
}
}
// this class tests the Algorithm using a list of evaluation criteria
class AlgorithmTest {
AlgorithmTest() {
...
... // Definition of input
... // Definition of list of evaluation criteria evals
...
Algorithm algorithm = new Algorithm(input); // Compute the result
for (EvaluationCriterion eval : evals) {
System.out.println(eval.getClassSimpleName()); // Print name of class
System.out.println(eval.evaluate(algorithm)); // Print evaluation result
}
}
main () {
new AlgorithmTest();
}
}
interface EvaluationCriterion {
double evaluate(Algorithm a);
}
// an example implementation of a criterion
class EvaluationA implements EvalutationCriterion{
double evaluation(Algorithm algorithm) {
a = algorithm.getA();
b = algorithm.getB();
double c = anotherComputation(a, b);
return c;
}
double anotherComputation(a, result){
... // compute and return result
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用函数式编程范例"转换"此源代码?我很确定,但是你还能像OOP方法一样轻松添加新的评估标准吗?
我可以编写一个名为algorithm的模块,其中包含计算a或b的纯函数.在这种情况下,我必须计算两次,这需要很多时间.
但是如何使用多个评估函数进行评估?
kee*_*gan 11
但是如何使用多个评估函数进行评估?
您将传递要使用的函数作为一等值.
您的类型EvaluationCriterion
基本上只是函数类型Algorithm -> Double
(在Haskell语法中). EvaluationA
,EvaluationB
等,并不需要有新的类型.它们只是类型的价值EvaluationCriterion
.您可以将它们作为值传递,构建类型列表[EvaluationCriterion]
等.
具有讽刺意味的是,您已经在解决方案中使用了一流的功能.这种抽象弱的OOP语言缺乏一流的功能,因此您必须应用标准化的解决方法("设计模式").将其转换为函数式语言(或仅仅是合理的OOP语言)是一个消除复杂性的问题.
现在,关于如何消除状态Algorithm
,我没有想到这一点.但请记住,FP并不意味着"没有状态".缓存纯函数结果是很常见的事情.
归档时间: |
|
查看次数: |
872 次 |
最近记录: |