我有處理哈斯克爾錯誤以下單子轉換。哈斯克爾單子和故障,不需要串
instance (Monad m, Error e) => Monad (EitherT e m) where
return = EitherT . return . return
m >>= k = EitherT $ do
a <- runEitherT m
case a of
Left l -> return (Left l)
Right r -> runEitherT (k r)
fail = EitherT . return . Left . strMsg
它的工作原理相當不錯,因爲我可以實例Error
與自定義類,並有由處理錯誤的一個非常靈活的手段。
fail
雖然是有點愚蠢,因爲它是類型String -> EitherT e m
,並且String
限制可能是一個惱人的方式來創建錯誤。我結束了一大堆:
instance Error BazError where
strMsg "foo" = FooError -- oh look we have no error context
strMsg "bar" = BarError -- isn't that nice
我希望做的是創建一個新的功能,如fail
,即a -> e
型的,這樣我可以刪除(Error e)
限制。 fail
是特別方便,當單子疊變大,當我結束了
EitherT BazError (StateT [BazWarning] IO) Foo
像有沒有一種方法來創建具有相同的行爲fail
用較少限制的類型的函數?或者fail
採用深哈斯克爾黑暗魔法來實現?如果您在做塊有一個模式匹配失敗
你或許應該簡單地避免'fail'完全,除非你要自定義的行爲對失敗'do'塊模式相匹配。 – ehird 2011-12-22 10:22:45