繁体   English   中英

如何在Java中实现Haskell数据类型?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM