如果您有這些哈斯克爾的數據類型如何在java中實現haskell數據類型?
data Mlist a = Mlist [a]
data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show)
什麼在java寫這個的最佳方式?
如果您有這些哈斯克爾的數據類型如何在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(產品總和)雖然,那麼事情可能會變得更加複雜。
通常這些類型使用繼承進行編碼。考慮番石榴Optional類。它相當於Haskell Maybe
數據類型。它被建模爲基類,名爲Optional
,以及兩個子類:Present
,它映射到Haskell Just
和Absent
,映射到Nothing
。基類Optional
也包含一些有用的工廠方法,如Optional.of(value)
或Optional.absent()
。我認爲這是你應該使用的方法。
但是,沒有模式匹配的ADT的值迅速減少。我認爲你最好不要嘗試在Java中使用Haskell成語,因爲它們是完全不同的語言,每種語言都有自己的一套模式和技術。其中一些常規概念可能對它們都有用(如Optional
/Maybe
),但通常在這些語言中存在完全不同的問題處理方法。
BTW,Scala語言(也運行在JVM)以類似的方式模型抽象數據類型,通常使用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 compiler運行此代碼並查看它生成的java代碼。
(弗雷格是試圖彌補缺失的哈斯克爾,JVM後端一個JVM語言,弗雷格本質上是2010哈斯克爾以及更高等級的多態類型和Java的互操作。)
出了什麼問題Java的現有列表數據類型?至於後者,我並不真正瞭解Java,但它必須有某種枚舉... – 2013-03-16 19:07:13
也許你可以看看http://jamesiry.github.com/jADT/index.html – huynhjl 2013-03-16 20:28:22