如果您有这些 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/