2016-03-08 32 views
0

在Okasaki的「純粹功能數據結構」中,有一種情況是我們創建一個帶有類型字段的類,該類型是該類型參數的類型參數。源存在ML:如何在Scala中使用類型的成員?

trait Queue[E, Q] { 
    def empty: Q 

    def isEmpty: Q => Boolean 

    def snoc: (Q, E) => Q 

    def head: Q => E 

    def tail: Q => Q 
} 

所以我們基本上有一個:

signature Queue 
do 
    type α Queue 

    (* some methods *) 
end 

在Scala中,我把它與Queue[E, Q],其中E代表α和Q是原Queue成員類型模型定義軸承結構Q和元件E的操作。這工作對我蠻好了好一陣子,直到我遇到了一個CatenableList

functor CatenableListFromQueue(Q : Queue): CatenableList = 
struct 
    datatype α Cat = E | C of α × α Cat susp Q.Queue 

    (* some methods *) 
end 

現在datatype α Cat = E | C of α × α Cat susp Q.Queue似乎並沒有很好地成爲斯卡拉模型:它需要像

sealed trait Cat[+E, +Q[E, _]] 

object Empty extends Cat[Nothing, Nothing] 

case class C[E, Q](x: E, q: Q[Susp[Cat[E]], ???]) extends Cat[E, Q] 

但這要求類型構造函數Q[_, ???]可用;注意,我們希望擁有元素類型,同時讓調用者選擇軸承結構。

在Haskell,這看起來很簡單:

data CatList q a = E | C a (q (CatList q a)) 

instance Queue q => CatenableList (CatList q) where 
    -- methods 

我怎麼錯過?

回答

0

顯然,我應該已經採取了Haskell的做法:讓CatList不知情的隊列細節,並請求類型類這是能夠提取任何隊列所需類型的元素,我們正在與供應:

object CatenableListFromQueue { 

    sealed trait CatList[+Q[_], +E] 

    object Empty extends CatList[Nothing, Nothing] 

    case class C[Q[_], E](x: E, q: Q) extends CatList[Q, E] 
} 

class CatenableListFromQueue[E, Q](implicit q: Queue[CatList[Q, E], Q]) extends CatenableList[E] { 

    type CL = CatList[Q, E] 
相關問題