Skip to content

Commit

Permalink
ch22
Browse files Browse the repository at this point in the history
  • Loading branch information
Francisco Tanudjaja committed Mar 11, 2016
1 parent e32950b commit 1b698ef
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/haskellbook/ch22/ch22.applicative.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{-# LANGUAGE InstanceSigs #-}

newtype Reader r a = Reader { runReader :: r -> a }


instance Functor (Reader r) where
fmap :: (a -> b) -> Reader r a -> Reader r b
fmap f (Reader ra) = Reader $ \r -> f (ra r)


instance Applicative (Reader r) where
pure :: a -> Reader r a
pure a = Reader $ const a

(<*>) :: Reader r (a -> b) -> Reader r a -> Reader r b
(Reader rab) <*> (Reader ra) = Reader $ \r -> rab r (ra r)


newtype HumanName = HumanName String deriving (Eq, Show)

newtype DogName = DogName String deriving (Eq, Show)

newtype Address = Address String deriving (Eq, Show)

data Person = Person { humanName :: HumanName, dogName :: DogName, address :: Address } deriving (Eq, Show)

data Dog = Dog { dogsName :: DogName, dogsAddress :: Address } deriving (Eq, Show)

getDogR :: Person -> Dog
getDogR = Dog <$> dogName <*> address

getDogR' :: Reader Person Dog
--getDogR' = Reader $ \p -> Dog (dogName p) (address p) -- ooh, bad soln
getDogR' = Dog <$> Reader dogName <*> Reader address

42 changes: 42 additions & 0 deletions src/haskellbook/ch22/ch22.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import Data.Char

cap :: [Char] -> [Char]
cap xs = map toUpper xs

rev :: [Char] -> [Char]
rev xs = reverse xs

composed :: [Char] -> [Char]
composed = cap . rev

fmapped :: [Char] -> [Char]
fmapped = fmap cap rev

tupled :: [Char] -> ([Char], [Char])
tupled = (,) <$> cap <*> rev

tupled' :: [Char] -> ([Char], [Char])
tupled' = do
a <- rev
b <- cap
return (a, b)

tupled'' :: [Char] -> ([Char], [Char])
tupled'' = (rev . cap) >>= (,)


newtype Reader r a = Reader { runReader :: r -> a }

instance Functor (Reader r) where
-- fmap :: (a -> b) -> Reader r a -> Reader r b
fmap f (Reader ra) = Reader $ \r -> f (ra r)

ask :: Reader a a
ask = Reader id

myLiftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -> f c
myLiftA2 f a b = f <$> a <*> b

asks :: (r -> a) -> Reader r a
asks f = Reader f

0 comments on commit 1b698ef

Please sign in to comment.