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

标签 java haskell functional-programming frege

如果您有这些 Haskell 数据类型

data Mlist a = Mlist [a]

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

用java编写这个的最好方法是什么?

最佳答案

如果你想在Java中获得仅求和的类型,那么这很容易。只需使用枚举:

public enum Mordering {
    MLT, MEQ, MGT, MIN
}

您甚至可以免费获得 equals、toString() 和其他有用的东西。如果您需要纯产品类型,例如 Mlist,那么简单的类就是正确的选择:

public class Mlist<T> {
    public final List<T> list;

    public Mlist(List<T> list) {
        this.list = list;
    }
}

如果您需要完整的 ADT(乘积之和),那么事情可能会变得更加复杂。

通常此类类型使用继承进行编码。考虑 Guava Optional类(class)。它相当于 Haskell Maybe 数据类型。它被建模为一个名为 Optional 的基类,以及两个子类:Present(映射到 Haskell Just)和 Absent,映射到 Nothing。另外,基类 Optional 包含一些有用的工厂方法,例如 Optional.of(value)Optional.absent()。我认为这是您应该使用的方法。

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

顺便说一句,Scala 语言(也在 JVM 上运行)以类似的方式对 ADT 进行建模,通常使用抽象密封基类和多个扩展它的case类:

abstract sealed class Optional[+T]
case class Present[+T](value: T) extends Optional[T]
case class Absent() extends Optional[Nothing]

关于java - 如何在java中实现haskell数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15453209/

相关文章:

haskell "Dot Hack"

haskell - 在haskell中的函数定义中声明函数类型

algorithm - 在 Haskell 中快速获取大小为 N 的所有子集

functional-programming - 使用参与者模型进行基于时间的模拟

java - 我如何获得用户音乐目录?

java - 休息模板 org.apache.http.NoHttpResponseException

java - java中内部类初始化的泛型数组

关于 Python 'map()' 函数的 Javascript 与 Python

scala - 在 Akka 中为多个 Actor 订阅 Dead Letters

java - 如何迭代可以由另一个线程添加到的列表