gpt4 book ai didi

java - 如何在 Java 中模拟 Haskell 的 "Either a b"

转载 作者:IT老高 更新时间:2023-10-28 20:52:47 27 4
gpt4 key购买 nike

如何编写一个类型安全的 Java 方法来返回 a 类或 b 类的东西?例如:

public ... either(boolean b) {
if (b) {
return new Integer(1);
} else {
return new String("hi");
}
}

最干净的方法是什么?

(我唯一想到的是使用异常,这显然很糟糕,因为它滥用了通用语言功能的错误处理机制......

public String either(boolean b) throws IntException {
if (b) {
return new String("test");
} else {
throw new IntException(new Integer(1));
}
}

)

最佳答案

我模拟代数数据类型的通用公式是:

  • 类型是一个抽象基类,构造函数是它的子类
  • 每个构造函数的数据在每个子类中定义。 (这允许具有不同数量数据的构造函数正常工作。它还消除了维护不变量的需要,例如只有一个变量是非空的或类似的东西)。
  • 子类的构造函数用于构造每个构造函数的值。
  • 要解构它,使用 instanceof 来检查构造函数,然后向下转换为适当的类型以获取数据。

所以对于 Either a b,它会是这样的:

abstract class Either<A, B> { }
class Left<A, B> extends Either<A, B> {
public A left_value;
public Left(A a) { left_value = a; }
}
class Right<A, B> extends Either<A, B> {
public B right_value;
public Right(B b) { right_value = b; }
}

// to construct it
Either<A, B> foo = new Left<A, B>(some_A_value);
Either<A, B> bar = new Right<A, B>(some_B_value);

// to deconstruct it
if (foo instanceof Left) {
Left<A, B> foo_left = (Left<A, B>)foo;
// do stuff with foo_left.a
} else if (foo instanceof Right) {
Right<A, B> foo_right = (Right<A, B>)foo;
// do stuff with foo_right.b
}

关于java - 如何在 Java 中模拟 Haskell 的 "Either a b",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9975836/

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