0

これらの Haskell データ型がある場合

data Mlist a = Mlist [a]

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

これをJavaで書く最良の方法は何ですか?

4

2 に答える 2

8

Javaで合計のみの型を取得したい場合は、簡単です。使用するだけ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オプションクラスを検討してください。HaskellMaybeデータ型と同等です。Optionalこれは、と呼ばれる基本クラス、および2つのサブクラスとしてモデル化されます。これPresentはHaskellJustにマップされ、、はにAbsentマップされNothingます。また、基本クラス、、には、またはOptionalのようないくつかの便利なファクトリメソッドが含まれています。これがあなたが使うべきアプローチだと思います。Optional.of(value)Optional.absent()

ただし、パターンマッチングのないADTの値は、すぐに減少します。JavaでHaskellイディオムを使用しようとしない方がよいと思います。これらは完全に異なる言語であり、それぞれが独自のパターンと手法のセットを持っているからです。一般的な概念のいくつかは(Optional/のようにMaybe)両方で役立つ場合がありますが、通常、これらの言語の問題にはまったく異なるアプローチがあります。

abstract sealedところで、Scala言語(JVMでも実行されます)は、通常、基本クラスとそれを複数case classes拡張することを使用して、同様の方法でADTをモデル化します。

abstract sealed class Optional[+T]
case class Present[+T](value: T) extends Optional[T]
case class Absent() extends Optional[Nothing]
于 2013-03-16T19:07:05.827 に答える
2

それを行うための最良の方法があるかどうかはわかりません。

しかし、アイデアを得るために、次のことを行うことができます: frege コンパイラでこのコードを実行し、生成された Java コードを調べます。

(Frege は、欠落している Haskell-JVM バックエンドを補おうとする JVM 言語です。Frege は、基本的に Haskell 2010 に加えて、上位のポリモーフィック型と Java 相互運用機能です。)

于 2013-03-23T14:46:12.770 に答える