gpt4 book ai didi

java - 这个 Haskell 函数的 Java 等价物是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:06:05 24 4
gpt4 key购买 nike

Philip Wadler 的论文“Monads for functional programming”有一个函数 eval 的例子,它执行用 Haskell 编写的除法。

这是改编自 Graham Hutton 的“Programming in Haskell”:

data Expr = Val Int | Div Expr Expr

eval :: Expr -> Int
eval (Val n) = n
eval (Div x y) = eval x `div` eval y

我的 Java 等价物是:

abstract class IntegerExpression {
abstract Integer evaluate();
}

class Value extends IntegerExpression {

Integer value;

public Value(Integer x) {
value = x;
}

public Integer evaluate() {
return value;
}
}

class DivisionExpression extends IntegerExpression {

IntegerExpression x, y;

public DivisionExpression(IntegerExpression a, IntegerExpression b) {
x = a;
y = b;
}

public Integer evaluate() {
return x.evaluate() / y.evaluate();
}

}

public class DivisionExample {

public static void main(String[] args) {
IntegerExpression two = new Value(2);
IntegerExpression twenty = new DivisionExpression (new Value(100), new Value(5));
IntegerExpression ten = new DivisionExpression(twenty, new Value(2));
IntegerExpression five = new DivisionExpression(new Value(10), two);
IntegerExpression expr = new DivisionExpression(ten, five);

System.out.println(expr.evaluate());
}
}

这看起来不错,但我如何开发这段代码,以便我可以在 Java 中演示 Try monad(捕捉被零除)?

最佳答案

编辑:在这种情况下解决失败的方法是使用 Maybe Monad,他在 Java 中的表亲是 Optional 类,其中 Option.of 将是 returnflatMap 将是 bind。另一方面,在 Java 和其他 O.O.在这种情况下,语言有一种常见的模式,称为复合,基本上你的数据类型 Expr 将是一个接口(interface)或抽象类,类型构造函数将是叶子:因此,考虑到所有这些,一个简单的工作示例是:

在 haskell 中:

data Expr = Val Int | Div Expr Expr

eval :: Expr -> Maybe Int
eval (Val n) = Just n
eval (Div x y) = do
v1 <- eval x
v2 <- eval y
if v2 == 0
then Nothing
else return (div v1 v2)
n1 = Val 8
n2 = Val 4
n3 = Val 0
d1 = Div n1 n2
d2 = Div d1 d1
d3 = Div d2 n3

main = do
putStrLn $ show (eval d2)
putStrLn $ show (eval d3)

Java 中的等效方法:

import java.util.Optional;

public interface Expr {

public Optional<Integer> eval();

}

然后叶子实现 Expr:

import java.util.Optional;

public class Val implements Expr{

Optional<Integer> value;

public Val(int value) {
this.value = Optional.of(value);
}

@Override
public Optional<Integer> eval() {
return value;
}
}

然后是递归情况:

import java.util.Optional;

public class Div implements Expr {

Expr expr1;
Expr expr2;

public Div(Expr expr1, Expr expr2) {
this.expr1 = expr1;
this.expr2 = expr2;
}

@Override
public Optional<Integer> eval() {
return expr1.eval().flatMap(v1 ->
expr2.eval().flatMap(v2 ->
(v2 == 0) ? Optional.empty() : Optional.of(v1 / v2)
)
);
}

public static void main(String[] args) {
Expr iv1 = new Val(6);
Expr iv2 = new Val(3);
Expr iv3 = new Val(2);
Expr iv4 = new Val(0);
Expr div1 = new Div(iv1, iv2);
Expr div2 = new Div(div1, iv3);
Expr div3 = new Div(div2, iv4);

System.out.println(div2.eval());
System.out.println(div3.eval());

}
}

主要功能输出将是:

Optional[1]
Optional.empty

关于java - 这个 Haskell 函数的 Java 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50967383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com