2015-11-24 83 views
1

我想了解Constr類型的Data.Data包。考慮下面的會議。 dataTypeConstrs返回一列Constr,這是Maybe的零參數和單參數構造函數。由於明顯的類型錯誤,試圖重新創建列表失敗。 GHC關於Constr價值的特殊行爲是什麼?瞭解Constr類型的Data.Data包的Haskell

$ 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

有趣的問題。在看Data.Data我看到有創建Constr實例的函數。像mkConstr。我猜測,Show for Constr的實例並沒有給你足夠的細節來實際構造一個Constr,因爲你試圖用i2 –

回答

0

這是不實際的構造函數的列表,但構造函數列表申述。它的Show實例使用了一個快速而寬鬆的輸出,這使得它看起來很別緻。

假裝它的東西,如

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

除非它被顯示在一個寬鬆的方式。

更準確地說,就是內部的,不透明的構造函數表示。使用constr*觀察者檢查Constr類型的值。

+0

的確如此,我錯過了Show實例的Constr實例Show Constr where show = constring'其中顯示了構造函數的名稱。只是一個很好的老窮人展示設計問題,謝謝! – grwlf