如果您有这些Haskell数据类型
data Mlist a = Mlist [a]
data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show)
在java中写这个的最好方法是什么?
答案 0 :(得分:8)
如果你想在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(产品总和),那么事情可能会变得更加复杂。
通常使用继承对这些类型进行编码。考虑一下Guava Optional类。它等同于Haskell Maybe
数据类型。它被建模为一个名为Optional
的基类,以及两个子类:Present
,映射到Haskell Just
,Absent
,映射到Nothing
。基类Optional
也包含一些有用的工厂方法,例如Optional.of(value)
或Optional.absent()
。我认为这是你应该使用的方法。
但是,没有模式匹配的ADT值很快就会减少。我认为你最好不要尝试在Java中使用Haskell习语,因为它们是完全不同的语言,每种语言都有自己的模式和技术。一些一般概念在两者中都很有用(例如Optional
/ Maybe
),但通常在这些语言中存在完全不同的问题处理方法。
abstract sealed
基类和多个case classes
扩展它:
abstract sealed class Optional[+T]
case class Present[+T](value: T) extends Optional[T]
case class Absent() extends Optional[Nothing]
答案 1 :(得分:2)
不确定是否有最佳方式。
但是为了得到一个想法,可以执行以下操作:通过frege compiler运行此代码并查看它生成的java代码。
(Frege是一种JVM语言,试图弥补缺少的Haskell-JVM后端.Frege本质上是Haskell 2010加上排名较高的多态类型和Java互操作。)