我有一個數據結構,其中包含一個名爲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]
我有一個數據結構,其中包含一個名爲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]
你要的類型參數t
傳播到obj類型:
data Fluent t = Fluent [t]
data Obj t = Obj [Fluent t]
:t Obj $ map Fluent ["a", "bcd"] -- Obj Char
我不想爲列表中的每個'Fluent'輸入相同的類型 – BinRoot
@BinRoot嘗試這個實驗:假裝某人已經爲您修復了Obj,然後寫出您希望可以使用的示例表達式以及它的類型。注意我在我的例子中也做了同樣的事情。如果我們知道你希望你的類型如何表現,那麼嘗試提供解決方案的猜測就會少一些。 – amalloy
@BinRoot如果你完全失去了有關't'的信息,'Obj'就會成爲未知事物列表的列表。用這樣一個列表你可以做的不多。在你的例子中,假設它的工作原理,除了計算元素的數量之外,沒有人能夠實際訪問'o'。這是因爲例如'head(head o)'將是一個未知的類型,所以你不能在任何地方使用它。 – chi
你的例子顯示瞭如何一個可以構造一個'Obj'值。什麼消除/銷燬?也就是說,你期望如何使用'Obj'類型的值?如果你訪問它最內層的元素,它們是一個未知的類型,所以你不能對它們做任何需要靜態類型(即所有東西)的任何事情。因此,您需要使用'Dynamic'類型,或者更精確的'Obj/Fluent'類型來保存一些類型信息(可能使用GADT,但很難說)。 – chi