これらの Haskell データ型がある場合
data Mlist a = Mlist [a]
data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show)
これを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
は、単純なクラスが最適です。
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]
それを行うための最良の方法があるかどうかはわかりません。
しかし、アイデアを得るために、次のことを行うことができます: frege コンパイラでこのコードを実行し、生成された Java コードを調べます。
(Frege は、欠落している Haskell-JVM バックエンドを補おうとする JVM 言語です。Frege は、基本的に Haskell 2010 に加えて、上位のポリモーフィック型と Java 相互運用機能です。)