[英]Haskell in java, how can i implement “any”(haskell) in java?
[英]How to implement haskell data types in java?
如果您具有这些Haskell数据类型
data Mlist a = Mlist [a]
data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show)
用Java编写此内容的最佳方法是什么?
如果要在Java中获取仅求和类型,那么这很容易。 只需使用enum
:
public enum Mordering {
MLT, MEQ, MGT, MIN
}
您甚至可以免费获得平等, toString()
和其他有用的东西。 如果您需要仅产品类型的类型(例如Mlist
,那么简单的类是Mlist
的方法:
public class Mlist<T> {
public final List<T> list;
public Mlist(List<T> list) {
this.list = list;
}
}
但是,如果您需要完整的ADT(产品总和),事情可能会变得更加复杂。
通常,此类使用继承进行编码。 考虑番石榴Optional类。 它等效于Haskell Maybe
数据类型。 它被建模为一个称为Optional
的基类,以及两个子类: Present
(对应到Haskell Just
)和Absent
(对应到Nothing
。 基类Optional
包含一些有用的工厂方法,例如Optional.of(value)
或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互操作。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.