@@ -27,13 +27,16 @@ module Task
2727 saveTheDiabetic,
2828 calculateSugarDanger,
2929 runStRandom, genStIntDouble
30+ , foo
3031 )
3132where
3233
3334import System.Random
3435import Control.Monad
3536
36−newtype State s a = State { runState :: s -> IO (s, a) }
37+newtype State m s a = State { runState :: s -> (s, m a) }
38+newtype Reader m s a = Reader { runReader :: s -> m a }
39+type Foo s s' a = State (Reader Identity s') s a
3740
3841instance Functor (State s) where
3942 -- fmap :: (a -> b) -> functor a -> functor b
@@ -72,6 +75,9 @@ genStIntDouble = do
7275 double <- stRandom
7376 return (int, double)
7477
78+foo :: State StdGen [(Int, Double)]
79+foo = sequenceA [genStIntDouble, genStIntDouble]
80+
7581-- fold [] = mempty
7682-- fold (x: xs) = x <> fold xs
7783
@@ -135,19 +141,23 @@ destructFirstMonoid (FirstMonoid a) = a
135141--
136142-- >>> (destructLastMonoid . fold . fmap constructLastMonoid) []
137143-- Nothing
138−data LastMonoid a
144+data LastMonoid a = LastMonoid (Maybe a)
145+
146+instance Semigroup (LastMonoid a) where
147+ a <> LastMonoid Nothing = a
148+ _ <> LastMonoid (Just a) = LastMonoid (Just a)
139149
140−instance Semigroup (LastMonoid a)
141150
142−instance Monoid (LastMonoid a)
151+instance Monoid (LastMonoid a) where
152+ mempty = LastMonoid Nothing
143153
144154-- Warps an `a` in a `LastMonoid`.
145155constructLastMonoid :: a -> LastMonoid a
146−constructLastMonoid = error "TODO: constructLastMonoid"
156+constructLastMonoid a = LastMonoid (Just a)
147157
148158-- Unwraps the `a` from a `LastMonoid`, if there is one.
149159destructLastMonoid :: LastMonoid a -> Maybe a
150−destructLastMonoid = error "TODO: destructLastMonoid"
160+destructLastMonoid (LastMonoid a) = a
151161
152162-- _____ _ _ _ _
153163-- |_ _|__ __| | ___ | | (_)___| |_