這裏是我的雞蛋包裝廠:使用也許和作家一起
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
的功能呢?有沒有更好的方法來做到這一點?
注意,寫它作爲'加4> =>添加2 $紙箱2'或添加2 <= <添加4 $紙箱2'或使用不常見的&,'紙箱2&添加4> =>添加2'允許您省略純淨。 – Gurkenglas