語境:我想產生一個錯誤的單子也不斷警告的列表的軌道,這樣的事情:生存類型和單子變壓器
data Dangerous a = forall e w. (Error e, Show e, Show w) =>
Dangerous (ErrorT e (State [w]) a)
即Dangerous a
是導致(Either e a, [w])
,其中e
操作是一個可顯示的錯誤,並且w
是可顯示的。
問題是,我似乎無法真正運行該事情,主要是因爲我不明白存在類型。注意:
runDangerous :: forall a e w. (Error e, Show e, Show w) =>
Dangerous a -> (Either e a, [w])
runDangerous (Dangerous f) = runState (runErrorT f) []
這並不編譯,因爲:
Could not deduce (w1 ~ w)
from the context (Error e, Show e, Show w)
...
`w1' is a rigidtype variable bound by
a pattern with constructor
Dangerous :: forall a e w.
(Error e, Show e, Show w) =>
ErrorT e (State [w]) a -> Dangerous a
...
`w' is a rigid type variable bound by
the type signature for
runDangerous :: (Error e, Show e, Show w) =>
Dangerous a -> (Either e a, [w])
我迷路了。什麼是w1?爲什麼我們不能推斷它是~ w
?
有沒有更好的(或更習慣的)方式來做到這一點?我真的只想要一個帶有一些警告的錯誤monad。 – So8res 2011-12-22 19:43:42
爲什麼不直接將類型定義爲「Dangerous e w a」?如果我明白你想要達到的目標(我很可能不會這樣做),這裏沒有必要存在這種存在。 – ehird 2011-12-22 19:45:09
我有幾個模塊都會拋出自己的錯誤和警告,並且它們在頂層處理。頂層只需要打印它們,但是在模板文件中選擇模塊和危險模板錯誤模板警告模板時會出現'Dangerous OptError OptWarning [Option]'和'Dangerous TemplateError TemplateWarning Template',當它們全都是'show'n時很煩人。我試圖刪除大量的樣板並學習一些東西,這當然不是必需的。 – So8res 2011-12-22 19:48:40