【问题标题】:Haskell: custom data, using in functionHaskell:自定义数据,在函数中使用
【发布时间】:2011-07-20 15:15:35
【问题描述】:

我已经创建了一个数据组:

data Cars = vw | audi | ford
data Engine = TDI | TSI 

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

[(x,y) | x <- Cars , y <- Engine]

但我对如何在函数中使用 data 有点迷茫。

我收到此错误:

Not in scope: data constructor `Cars'

【问题讨论】:

  • 另请注意,类型构造函数的名称和它们本身的类型名称都必须以大写字母开头。

标签: haskell


【解决方案1】:

CarsEngine 是类型,仅此而已,尤其不是构造函数列表。要获取某个类型的所有构造函数的集合,请将其设为 Enum 和可能的 Bounded 的实例(derive 两者都可以,Bounded 不是必需的,但很好,因为它允许不对起始值进行硬编码)。参见例如this question(特别是this answer)。复制并调整该代码(另外,我修复了 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]

【讨论】:

  • 我比我的方法更喜欢这个;但是如果您将deriving 子句添加到您的代码中会很好。
  • +1 我喜欢通用allValues 函数的想法,我从来没有想到过。我知道很多情况下这可以在我的程序中节省一些代码。
  • @Ferich:更好的是,它不是一个函数,而是一个该死的多态常量。尝试击败它,平均类型系统。
【解决方案2】:

这是你想要的吗?

$cat t.hs
data Cars = Vw | Audi | Ford 
        deriving (Enum, Show)
data Engine = TDI | TSI  
        deriving (Enum, Show)


main = print [(x,y) | x <- [Vw .. Ford] , y <- [TDI .. TSI]]


$ghc t.hs

$./a.out 
[(Vw,TDI),(Vw,TSI),(Audi,TDI),(Audi,TSI),(Ford,TDI),(Ford,TSI)]

【讨论】:

  • 你要解释这里发生了什么?
【解决方案3】:

不幸的是,您不能以这种方式访问​​数据类型的构造函数。首先,所有的数据构造函数都需要大写,所以改成这样:

data Cars = VW | Audi | Ford deriving Show
data Engine = TDI | TSI      deriving Show

-- create explicit lists of the constructors
carTypes :: [Cars]
carTypes = [VW, Audi, Ford]

engineTypes :: [Engine]
engineTypes = [TDI, TSI]

现在您可以在列表理解中使用这些列表

> let ll = [(x,y) | x <- carTypes, y <- engineTypes]
> show ll
> [(VW,TDI),(VW,TSI), (Audi,TDI),(Audi,TSI),(Ford,TDI),(Ford,TSI)]
> :type ll
> ll :: [(Cars,Engine)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2015-08-29
    • 2021-12-28
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多