我创建了一个数据组:
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)