2013-03-16 25 views
0

如果您有這些哈斯克爾的數據類型如何在java中實現haskell數據類型?

data Mlist a = Mlist [a] 

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

什麼在java寫這個的最佳方式?

+0

出了什麼問題Java的現有列表數據類型?至於後者,我並不真正瞭解Java,但它必須有某種枚舉... – 2013-03-16 19:07:13

+0

也許你可以看看http://jamesiry.github.com/jADT/index.html – huynhjl 2013-03-16 20:28:22

回答

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(產品總和)雖然,那麼事情可能會變得更加複雜。

通常這些類型使用繼承進行編碼。考慮番石榴Optional類。它相當於Haskell Maybe數據類型。它被建模爲基類,名爲Optional,以及兩個子類:Present,它映射到Haskell JustAbsent,映射到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] 
2

不知道有做一個最好方式它。

但是爲了得到一個想法,可以執行以下操作:通過frege compiler運行此代碼並查看它生成的java代碼。

(弗雷格是試圖彌補缺失的哈斯克爾,JVM後端一個JVM語言,弗雷格本質上是2010哈斯克爾以及更高等級的多態類型和Java的互操作。)