这是我的鸡蛋包装厂:
type Eggs = Int
data Carton = Carton Eggs deriving Show
add :: Eggs -> Carton -> Maybe Carton
add e (Carton c)
| c + e <= 12 = Just (Carton $ c + e)
| otherwise = Nothing
main = do
print $ pure(Carton 2) >>= add 4 >>= add 4 >>= add 3
似乎运作良好,我可以很好地链接
add
职能。但是我想记录每一步添加了多少鸡蛋的日志。所以我这样做:
import Control.Monad.Writer
type Eggs = Int
data Carton = Carton Eggs deriving Show
add :: Eggs -> Carton -> Writer [String] (Maybe Carton)
add e (Carton c)
| c + e <= 12 = do
tell ["adding " ++ show e]
return (Just (Carton $ c + e))
| otherwise = do
tell ["cannot add " ++ show e]
return Nothing
main = do
let c = add 4 $ Carton 2
print $ fst $ runWriter c
mapM_ putStrLn $ snd $ runWriter c
这给了我想要的东西:我可以看到生成的纸箱和添加 4 个鸡蛋的记录。
但是我好像失去了上链的能力
add
像我以前一样的功能:let c = pure(Carton 2) >>= add 4 -- works
let c = pure(Carton 2) >>= add 4 >>= add 2 -- does not work
如何链接我的新启用作家的
add
职能?有没有更好的方法来做到这一点?
最佳答案
只需撰写 add
与 MaybeT
:
import Control.Trans.Monad.Maybe
test = pure (Carton 2) >>= MaybeT . add 3
>>= MaybeT . add 4
>>= MaybeT . add 5
runTest = do
print $ fst $ runWriter (runMaybeT test)
完整示例位于:http://lpaste.net/169070
关于haskell - 一起使用 Maybe 和 Writer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38194378/