Haskell 如何使用包含类型参数类型列表的值构造函数创建数据类型

Haskell 如何使用包含类型参数类型列表的值构造函数创建数据类型,haskell,type-parameter,Haskell,Type Parameter,我有一个数据结构,带有一个名为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 = O

我有一个数据结构,带有一个名为
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

必须将类型参数
t
传播到Obj类型:

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

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

我不希望每个
Fluent
都使用相同的类型list@BinRoot尝试这个实验:假设有人已经为您修复了Obj,然后写出一个您希望可以使用的示例表达式及其类型。注意,我在我的示例中也做了同样的事情。如果我们知道您希望您的类型如何运行,那么尝试提供解决方案就不会那么费解了。@BinRoot如果您完全丢失了关于
t
是什么的信息,则
Obj
将成为未知事物列表。这样一张单子你没什么办法。在您的示例中,假设它有效,除了计算元素的数量之外,没有人可以访问
o
。这是因为,例如,
head(head o)
将是未知类型,因此您不能在任何地方使用它。如果您确实需要,您可以使用
HList
或类似的工具,但这是一个大锤子。你的实际目的是什么?我不想让每个
Fluent
都使用相同的类型list@BinRoot尝试这个实验:假设有人已经为您修复了Obj,然后写出一个您希望可以使用的示例表达式及其类型。注意,我在我的示例中也做了同样的事情。如果我们知道您希望您的类型如何运行,那么尝试提供解决方案就不会那么费解了。@BinRoot如果您完全丢失了关于
t
是什么的信息,则
Obj
将成为未知事物列表。这样一张单子你没什么办法。在您的示例中,假设它有效,除了计算元素的数量之外,没有人可以访问
o
。这是因为,例如,
head(head o)
将是未知类型,因此您不能在任何地方使用它。如果您确实需要,您可以使用
HList
或类似的工具,但这是一个大锤子。您的实际目的是什么?您的示例展示了如何构造
Obj
值。那么消除/销毁呢?即,您希望如何使用类型为
Obj
的值?如果您访问它的最里面的元素,它们的类型是未知的,因此您不能对它们执行任何需要静态类型的操作(即,所有操作)。因此,您要么需要使用
动态
类型,要么使用一些更精确的
Obj/Fluent
类型来保存一些类型信息(可能使用GADT,但很难说)。您的示例展示了如何构造
Obj
值。那么消除/销毁呢?即,您希望如何使用类型为
Obj
的值?如果您访问它的最里面的元素,它们的类型是未知的,因此您不能对它们执行任何需要静态类型的操作(即,所有操作)。因此,您要么需要使用
动态
类型,要么使用一些更精确的
Obj/Fluent
类型来保存一些类型信息(可能使用GADT,但很难判断)。