gpt4 book ai didi

java - 如何在java中实现haskell数据类型?

转载 作者:行者123 更新时间:2023-12-01 06:45:37 25 4
gpt4 key购买 nike

如果您有这些 Haskell 数据类型

data Mlist a = Mlist [a]

data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show)

用java编写这个的最好方法是什么?

最佳答案

如果你想在Java中获得仅求和的类型,那么这很容易。只需使用枚举:

public enum Mordering {
MLT, MEQ, MGT, MIN
}

您甚至可以免费获得 equals、toString() 和其他有用的东西。如果您需要纯产品类型,例如 Mlist,那么简单的类就是正确的选择:

public class Mlist<T> {
public final List<T> list;

public Mlist(List<T> list) {
this.list = list;
}
}

如果您需要完整的 ADT(乘积之和),那么事情可能会变得更加复杂。

通常此类类型使用继承进行编码。考虑 Guava Optional类(class)。它相当于 Haskell Maybe 数据类型。它被建模为一个名为 Optional 的基类,以及两个子类:Present(映射到 Haskell Just)和 Absent,映射到 Nothing。另外,基类 Optional 包含一些有用的工厂方法,例如 Optional.of(value)Optional.absent()。我认为这是您应该使用的方法。

但是,没有模式匹配的 ADT 的值(value)很快就会减弱。我认为你最好不要尝试在 Java 中使用 Haskell 习惯用法,因为它们是完全不同的语言,每种语言都有自己的一套模式和技术。一些通用概念可能对这两种语言都有用(例如Optional/Maybe),但通常这些语言有完全不同的解决问题的方法。

顺便说一句,Scala 语言(也在 JVM 上运行)以类似的方式对 ADT 进行建模,通常使用抽象密封基类和多个扩展它的case类:

abstract sealed class Optional[+T]
case class Present[+T](value: T) extends Optional[T]
case class Absent() extends Optional[Nothing]

关于java - 如何在java中实现haskell数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453209/

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