如何在java中实现haskell数据类型?

时间:2013-03-16 18:46:12

标签: java haskell functional-programming frege

如果您有这些Haskell数据类型

data Mlist a = Mlist [a]

data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show)

在java中写这个的最好方法是什么?

2 个答案:

答案 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 JustAbsent,映射到Nothing 。基类Optional也包含一些有用的工厂方法,例如Optional.of(value)Optional.absent()。我认为这是你应该使用的方法。

但是,没有模式匹配的ADT值很快就会减少。我认为你最好不要尝试在Java中使用Haskell习语,因为它们是完全不同的语言,每种语言都有自己的模式和技术。一些一般概念在两者中都很有用(例如Optional / Maybe),但通常在这些语言中存在完全不同的问题处理方法。

BTW,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]

答案 1 :(得分:2)

不确定是否有最佳方式。

但是为了得到一个想法,可以执行以下操作:通过frege compiler运行此代码并查看它生成的java代码。

(Frege是一种JVM语言,试图弥补缺少的Haskell-JVM后端.Frege本质上是Haskell 2010加上排名较高的多态类型和Java互操作。)