如何用Haskell實現面向對象編程?

不考慮實現OO的意義,僅考慮實現OO的思路和效果(

比如existential type class用於模擬inheritance。。


剛剛讀完了Haskell』s overlooked object system,

給出了幾個proposal,最後深入研究用HList encode recursive record。。。

很有意思,比如說,class,label是first class的,所以多重繼承玩得很溜,比如說可以自己控制菱形繼承

upcasting靠HList運算,得出least upper bound

subtyping靠typeclass bound推導,比如用到getX的class p就是有相應的typeclass constraint,用文中的話說,就是『一股C++ template的氣息撲面而來』

然後還有一定量的trick,比如如何upcast了又能downcast,比如如何防止virtual method沒定義就(遞歸)引用。。。就自己看吧,有79頁,好長啊,orz

不過還好信息密集度對於看過OO Theory(如inheritance is not subtyping)之類的東西的人不算高。。。


瀉藥,hackage上對OOP模擬的最像的應該是這個了吧:GitHub - fumieval/objective: Purely functional objects。基本思路很簡單,這裡的Object模擬了OOP里的class定義的方法,也就是各種各樣的狀態轉移函數,這裡的Instance使用了一個MVar來模擬OOP里的實例,也就是各種各樣的狀態數據,然後使用類型類抽象出諸如new, (.-)這樣的函數來創建實例,調用類方法。雖然整個DSL感覺像是個玩笑,可是仔細一想,OOP不也就是這麼回事兒嘛。

PS: 樓主不妨明確一下什麼是「OO的思路和效果」,這樣我也好從FP的角度具體解答對應的思路和效果。


推薦閱讀:

怎樣理解 Partial Evaluation?
請問大家了解函數式語言編譯器的實現技術嘛?
為什麼lambda演算中,函數在定義上只允許一個參數,而有時卻又會有多個參數的寫法呢?
比較兩個lambda表達式是否等價的lambda表達式怎麼寫?
函數式編程語言的「天然支持並行與並發」是不是吹牛?

TAG:面向對象編程 | 函數式編程 | Haskell |