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
我怎麼錯過?