理解Haskell的Constr类型的Data.Data包

时间:2015-11-24 12:52:09

标签: haskell scrap-your-boilerplate

我试图理解Data.Data包的Constr类型。考虑下面的会议。 dataTypeConstrs返回Constr的列表,包括Maybe的零参数和单参数构造函数。由于明显的类型错误,尝试重新创建列表失败。对于Constr值,这是GHC的特殊行为吗?

$ ghci
GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
Prelude> :set -XScopedTypeVariables
Prelude> :module +Data.Data
Prelude Data.Data> dataTypeConstrs (dataTypeOf (Nothing :: Maybe ()))
[Nothing,Just]
Prelude Data.Data> :i it
it :: [Constr]  -- Defined at <interactive>:4:1

Prelude Data.Data> let i2 :: [Constr] = [Nothing,Just]

<interactive>:6:23:
    Couldn't match expected type ‘Constr’ with actual type ‘Maybe a0’
    In the expression: Nothing
    In the expression: [Nothing, Just]

1 个答案:

答案 0 :(得分:0)

这不是实际构造函数的列表,而是构造函数表示的列表。它的Show实例使用快速而宽松的输出,这使得它看起来像别的东西。

只是假装它是

[ Constr{ name = "Nothing", args = 0, ... }
, Constr{ name = "Just", args = 1, ... }
]

除非它以松散的方式显示。

更准确地说,那就是内部,不透明的构造函数表示。使用constr*观察者检查Constr类型的值。