Hier mein Eierpack Fabrik ist:Mit Vielleicht und Writer zusammen
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
scheint gut zu funktionieren, kann ich gut Kette add
Funktionen.
Aber ich möchte ein Protokoll aufnehmen, wie viele Eier bei jedem Schritt hinzugefügt wurden. Also das ich tun:
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
Das gibt mir, was ich will: Ich kann die resultierende Karton und der Datensatz für 4 Eier sehen hinzugefügt werden.
Aber ich scheine die Fähigkeit zur Kette verloren haben add
Funktionen wie ich zuvor:
let c = pure(Carton 2) >>= add 4 -- works
let c = pure(Carton 2) >>= add 4 >>= add 2 -- does not work
Wie kann ich meine neue Schreiber-fähigen add
Funktionen Kette? Gibt es einen besseren Weg, dies zu tun?
Beachten sie, dass es als 'hinzufügen 4> => add 2 $ Carton Schreiben 2' oder 'add 2 <= => add 2' erlaubt es Ihnen, das Pure wegzulassen. –
Gurkenglas