Haskell:自定义数据,在函数中使用

Lun*_*nar 0 haskell

我创建了一个数据组:

data Cars = vw | audi | ford
data Engine = TDI | TSI 
Run Code Online (Sandbox Code Playgroud)

我想在函数/列表理解中使用它们.为了显示组合,我有这个:

[(x,y) | x <- Cars , y <- Engine]
Run Code Online (Sandbox Code Playgroud)

但我对如何使用data函数内部有点迷失.

我收到此错误:

Not in scope: data constructor `Cars'
Run Code Online (Sandbox Code Playgroud)

小智 11

Cars并且Engine是类型,仅此而已,尤其不是构造函数列表.要获得一个类型的所有构造函数的集合,请将其作为一个实例,Enum并且可能Bounded(您可以derive同时使用它们,Bounded但不是必需的,因为它不允许对起始值进行硬编码).参见例如这个问题(特别是这个答案).复制和调整该代码(同样,我修复了ctors的大小并重命名Cars为复数而不是非常具体):

data CarManufacturer = VW | Audi | Ford deriving (Bounded, Enum)
data Engine = TDI | TSI deriving (Bounded, Enum)

allValues :: (Bounded a, Enum a) => [a]
allValues = [minBound..]

allEngines = allValues :: [Engine]
allCars = allValues :: [CarManufacturer]

carsWithEngines = [(car, engine) | car <- allCars, engine <- allEngines]
Run Code Online (Sandbox Code Playgroud)