如果你有这些 Haskell 数据类型
data Mlist a = Mlist [a]
data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show)
用java编写这个的最好方法是什么?
如果你有这些 Haskell 数据类型
data Mlist a = Mlist [a]
data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show)
用java编写这个的最好方法是什么?
如果你想在 Java 中获得 sum-only 类型,那很容易。只需使用enum
:
public enum Mordering {
MLT, MEQ, MGT, MIN
}
您甚至可以免费获得平等toString()
和其他有用的东西。如果您需要仅产品类型,例如您的Mlist
,那么简单的类是要走的路:
public class Mlist<T> {
public final List<T> list;
public Mlist(List<T> list) {
this.list = list;
}
}
如果您需要完整的 ADT(产品总和),那么事情可能会变得更加复杂。
通常此类类型使用继承进行编码。考虑番石榴可选类。它等价于 HaskellMaybe
数据类型。它被建模为一个基类,称为Optional
和两个子类:Present
,映射到 Haskell Just
,和Absent
,映射到Nothing
。基类 , 也Optional
包含一些有用的工厂方法,例如Optional.of(value)
or Optional.absent()
。我认为这是您应该使用的方法。
然而,没有模式匹配的 ADT 的价值会迅速下降。我认为您最好不要尝试在 Java 中使用 Haskell 惯用语,因为它们是完全不同的语言,每种语言都有自己的一套模式和技术。一些通用概念可能对它们都有用(例如Optional
/ Maybe
),但通常在这些语言中存在完全不同的解决问题的方法。
顺便说一句,Scala 语言(也在 JVM 上运行)以类似的方式模拟 ADT,通常使用abstract sealed
基类和多个case classes
扩展它:
abstract sealed class Optional[+T]
case class Present[+T](value: T) extends Optional[T]
case class Absent() extends Optional[Nothing]
不确定是否有最好的方法来做到这一点。
但要获得一个想法,可以执行以下操作:通过frege 编译器运行此代码并查看它生成的 java 代码。
(Frege 是一种 JVM 语言,它试图弥补缺少的 Haskell-JVM 后端。Frege 本质上是 Haskell 2010 加上更高级别的多态类型和 Java 互操作。)