-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Francisco Tanudjaja
committed
Mar 11, 2016
1 parent
e32950b
commit 1b698ef
Showing
2 changed files
with
77 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|