2016-03-01 91 views
0

我有一個數據結構,其中包含一個名爲Fluent的類型參數。 我想要這些列表。什麼是最優雅的方式來解決這個代碼?如何使用包含類型參數類型列表的值構造函數創建數據類型

data Fluent t = Fluent [t] 
data Obj = Obj [Fluent] 

編輯:我希望能夠做到這一點:

f1 = Fluent [True, False] 
f2 = Fluent [1, 2, 3, 4] 
let o = Obj [f1, f2] 
+1

你的例子顯示瞭如何一個可以構造一個'Obj'值。什麼消除/銷燬?也就是說,你期望如何使用'Obj'類型的值?如果你訪問它最內層的元素,它們是一個未知的類型,所以你不能對它們做任何需要靜態類型(即所有東西)的任何事情。因此,您需要使用'Dynamic'類型,或者更精確的'Obj/Fluent'類型來保存一些類型信息(可能使用GADT,但很難說)。 – chi

回答

3

你要的類型參數t傳播到obj類型:

data Fluent t = Fluent [t] 
data Obj t = Obj [Fluent t] 

:t Obj $ map Fluent ["a", "bcd"] -- Obj Char 
+0

我不想爲列表中的每個'Fluent'輸入相同的類型 – BinRoot

+2

@BinRoot嘗試這個實驗:假裝某人已經爲您修復了Obj,然後寫出您希望可以使用的示例表達式以及它的類型。注意我在我的例子中也做了同樣的事情。如果我們知道你希望你的類型如何表現,那麼嘗試提供解決方案的猜測就會少一些。 – amalloy

+1

@BinRoot如果你完全失去了有關't'的信息,'Obj'就會成爲未知事物列表的列表。用這樣一個列表你可以做的不多。在你的例子中,假設它的工作原理,除了計算元素的數量之外,沒有人能夠實際訪問'o'。這是因爲例如'head(head o)'將是一個未知的類型,所以你不能在任何地方使用它。 – chi

相關問題