çŽè¿ã§ã¯ã
No Starch Press㯠ãåªãã
Learn You a Haskell for Great GoodïŒã®å°å·çãäœæããŠ
çºè¡ããŠã ãŸãã ïŒãªã³ã©ã€ã³çïŒMiranLipovaÄaã«ãã£ãŠæžãããŸããã
第11ç«
Applicative functorsã®ææ°ã®ç¿»èš³ããèŠãããããšæããŸãããã®åäœã¯ã
No Starch Pressã®åºçç©ã§ãå°å·ã«é©åããŠããŸãã
å¿çšãã¡ã³ã¯ã¿ãŒ
Haskellã®æž
æµåºŠã髿¬¡é¢æ°ããã©ã¡ãŒã¿ãŒåããã代æ°ããŒã¿åãããã³åã¯ã©ã¹ã®çµã¿åããã«ãããä»ã®èšèªããã倿
æ§ãåçŽã«ãªããŸãã 倧ããªéå±€ã«å±ããåã«ã€ããŠèããå¿
èŠã¯ãããŸããã 代ããã«ãåãã©ã®ããã«æ©èœãããã調ã¹ãé©åãªåã¯ã©ã¹ã䜿çšããŠåããã€ã³ãããŸãã
Int
ã¯ããšã³ãã£ãã£ã®ã»ãããšããŠåäœã§ããŸã-æ¯èŒããããšã³ãã£ãã£ãé åºä»ãããããšã³ãã£ãã£ãåæããããšã³ãã£ãã£ãªã©ã
åã¯ã©ã¹ã¯éããŠããŸããã€ãŸããç¬èªã®ããŒã¿åãå®çŸ©ãããã®åäœæ¹æ³ãèãããã®åäœãå®çŸ©ããåã¯ã©ã¹ã«é¢é£ä»ããããšãã§ããŸãã æ°ããåã¯ã©ã¹ãå°å
¥ããæ¢åã®åããã®ã€ã³ã¹ã¿ã³ã¹ã«ããããšãã§ããŸãã ãã®ããããŸãå宣èšã«ãã£ãŠã®ã¿é¢æ°ã«ã€ããŠå€ãã®ããšãç¥ãããšãã§ããåªããHaskellåã·ã¹ãã ã®ãããã§ãéåžžã«äžè¬çã§æœè±¡çãªåäœãèšè¿°ããåã¯ã©ã¹ãå®çŸ©ã§ããŸãã
2ã€ã®èŠçŽ ãçãããã©ããã確èªãã2ã€ã®èŠçŽ ãäœããã®é åºã§æ¯èŒããŠæ¯èŒããæäœãå®çŸ©ããåã¯ã©ã¹ã«ã€ããŠèª¬æããŸããã ãããã¯éåžžã«æœè±¡çã§ãšã¬ã¬ã³ããªåäœã§ãããç§ãã¡ã¯ã»ãšãã©ç¹å¥ãªäœããšã¯èããŠããŸããããç§ãã¡ã®ã»ãšãã©ã®äººçã§ããããæ±ã£ãŠããããã§ãã 第7ç« ã§ã¯ãå€ã衚瀺ã§ããåã§ãããã¡ã³ã¯ã¿ãŒãå°å
¥ãããŸããã ããã¯ãåã¯ã©ã¹ãèšè¿°ã§ãããæçšã§ãããªããäŸç¶ãšããŠæœè±¡çãªããããã£ã®äŸã§ãã ãã®ç« ã§ã¯ããã¡ã³ã¯ã¿ãŒã詳ããèŠãŠãããŸãããŸãããã¡ã³ã¯ã¿ãŒã®å°ã匷åã§äŸ¿å©ãªããŒãžã§ã³ã䜿çšããŸããããã¯ãã¢ããªã«ãã£ããã¡ã³ã¯ã¿ãŒãšåŒã°ããŸãã
ãã¡ã³ã¯ã¿ãŒãæ»ã
第7ç« ã§åŠãã ããã«ããã¡ã³ã¯ã¿ãŒã¯ããªã¹ãã
Maybe
å€ãããªãŒãªã©ã衚瀺ã§ãããšã³ãã£ãã£ã§ãã Haskellã§ã¯ããããã¯
Functor
åã¯ã©ã¹ã«ãã£ãŠèšè¿°ãããŸãããã®ã¯ã©ã¹ã«ã¯ã
fmap
1ã€ã®åã¯ã©ã¹ã¡ãœããã®ã¿ãå«ãŸããŸãã
fmap
ã¯
fmap :: (a -> b) -> fa -> fb
ã§ããaãåããbãšãaïŒãŸãã¯è€æ°ã®aïŒãå«ãããã¯ã¹ãè¿ã颿°ãæå®ããŠãã ãããå
éšã®
b
ïŒãŸãã¯ããã€ãã®
b
ïŒããããã¯ã¹å
ã®èŠçŽ ã«é¢æ°ãé©çšããŸãã
ãã¡ã³ã¯ã¿ã®å€ã¯ã远å ã®ã³ã³ããã¹ããæã€å€ãšããŠèªèããããšãã§ããŸãã ããšãã°ãå€ã«ã¯ãèšç®ã倱æããå¯èœæ§ããã远å ã®ã³ã³ããã¹ããå«ãŸããŠããå ŽåããããŸãã ãªã¹ãã«é¢é£ããŠãã³ã³ããã¹ãã¯ãå€ãè€æ°ã®å Žåãããã°ãååšããªãå ŽåããããŸãã
fmap
ã¯ãã³ã³ããã¹ããç¶æããªãã颿°ãå€ã«é©çšããŸãã
åã³ã³ã¹ãã©ã¯ã¿ã
Functor
ã€ã³ã¹ã¿ã³ã¹ã«ãããå Žåã
* -> *
ãšãã圢åŒã§ãªããã°ãªããŸãããããã¯ãåãã©ã¡ãŒã¿ãŒãšããŠå
·äœçãªåã1ã€ã ããšãããšãæå³ããŸãã ããšãã°ã
Maybe
Maybe Int
ã
Maybe String
ãªã©ãç¹å®ã®ã¿ã€ãã®è£œåã«å¯ŸããŠ1ã€ã®ã¿ã€ããã©ã¡ãŒã¿ãŒãåãåãããã
Maybe
ãã€ã³ã¹ã¿ã³ã¹ã«ããããšãã§ããŸãã ã¿ã€ãã³ã³ã¹ãã©ã¯ã¿ãŒã
Either,
ãããª2ã€ã®ãã©ã¡ãŒã¿ãŒãåãå Žåããã©ã¡ãŒã¿ãŒã1ã€ã ãã«ãªããŸã§ãã¿ã€ãã³ã³ã¹ãã©ã¯ã¿ãŒãéšåçã«é©çšããå¿
èŠããããŸãã ãããã£ãŠã
Functor Either where
ã¯èšè¿°ã§ããŸãã
Functor Either where
ã
Functor (Either a) where
èšè¿°ã§ããŸãã æ¬¡ã«ã
fmap
ã
Either a
ã§ã®ã¿åäœããããšãæ³åããŠããå Žåãæ¬¡ã®ã¿ã€ãã®èª¬æããããŸãã
fmap :: (b -> c) -> Either ab -> Either ac
ã芧ã®ãšããã
Either a
1ã€ã®åãã©ã¡ãŒã¿ãŒã®ã¿ãåãå
¥ããããã
Either a
ã®éšå
Either a
åºå®ãããŠããŸãã
ãã¡ã³ã¯ã¿ãŒãšããŠã®I / Oã¢ã¯ã·ã§ã³
ãããŸã§ã«ã
Functor
ã€ã³ã¹ã¿ã³ã¹ã§ããåïŒæ£ç¢ºã«ã¯ãåã³ã³ã¹ãã©ã¯ã¿ãŒïŒã®æ°ã調ã¹ãŠããŸããïŒ
[]
ããã³
Maybe
ã
Either a
ããã³ç¬¬7ç« ã§äœæãã
Tree
åãåã®ããã«é¢æ°ã䜿çšããã æ¬¡ã«ã
IO
ã€ã³ã¹ã¿ã³ã¹ãèŠãŠã¿ãŸãããã
ããšãã°ãããçš®ã®å€ã
IO String
ã®ã¿ã€ãã§ããå Žåãããã¯å®éã®äžçã«åºãŠäœããã®çµæã®æååãååŸããI / Oã¢ã¯ã·ã§ã³ã§ããããšãæå³ããçµæãšããŠè¿ãããŸãã doæ§æã§
<-
ã䜿çšããŠããã®çµæãååã«ãã€ã³ãã§ããŸãã 第8ç« ã§ã¯ãI / Oã¢ã¯ã·ã§ã³ãå€ã«åºãŠå€ã®äžçããäœããã®æå³ãæã€å°ããªè¶³ã®ããç®±ã®ããã«èŠããæ¹æ³ã«ã€ããŠèª¬æããŸããã ããããããããããã®ãèŠãããšãã§ããŸããã衚瀺ããåŸãå€ã
IO
ã«ã©ããããå¿
èŠããããŸãã ãã®èä»ãããã¯ã¹ã®é¡äŒŒæ§ãèŠããšã
IO
ããã¡ã³ã¯ã¿ãŒãšããŠã©ã®ããã«æ©èœããããçè§£ã§ããŸãã
IO
ã
Functor
ã€ã³ã¹ã¿ã³ã¹ã§ããæ¹æ³ãèŠãŠã¿ãŸãããã 颿°ã䜿çšããŠI / Oã¢ã¯ã·ã§ã³ã衚瀺ããããã«
fmap
ã䜿çšãããšããåãããšãè¡ãI / Oã¢ã¯ã·ã§ã³ãååŸãããã®ã§ããã颿°ã¯çµæã®å€ã«é©çšãããŸãã ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
instance Functor IO where fmap f action = do result <- action return (f result)
I / Oã¢ã¯ã·ã§ã³ã«äœãã衚瀺ããçµæãI / Oã¢ã¯ã·ã§ã³ã§ãããããããã«
do
æ§æã䜿çšããŠ2ã€ã®ã¢ã¯ã·ã§ã³ãçµåãã1ã€ã®æ°ããã¢ã¯ã·ã§ã³ãäœæããŸãã
fmap
ã®å®è£
ã§ã¯ãæåã®I / Oã¢ã¯ã·ã§ã³ãæåã«å®è¡ããæ°ããI / Oã¢ã¯ã·ã§ã³ãäœæããçµæã«resultãšããååãä»ããŸãã æ¬¡ã«ã
return (f result)
ãŸãã
return
ã¯ãäœãããªããçµæãšããŠäœããè¿ãã ãã®I / Oã¢ã¯ã·ã§ã³ãäœæãã颿°ã§ããããšãæãåºããŠãã ããã
do
ãããã¯ãçæããã¢ã¯ã·ã§ã³ã¯ãåžžã«æåŸã®ã¢ã¯ã·ã§ã³ã®çµæå€ãè¿ããŸãã ãããã
return
ã䜿çšããŠãå®éã«ã¯äœããããæ°ããI / Oã¢ã¯ã·ã§ã³ã®
f result
ãšããŠ
f result
ãåã«è¿ãI / Oã¢ã¯ã·ã§ã³ãäœæããçç±ã§ãã æ¬¡ã®ã³ãŒããã芧ãã ããã
main = do line <- getLine let line' = reverse line putStrLn $ "You said " ++ line' ++ " backwards!" putStrLn $ "Yes, you really said" ++ line' ++ " backwards!
ãŠãŒã¶ãŒã¯æååã®å
¥åãæ±ããããããããŠãŒã¶ãŒã«è¿ããŸãããå転ããŸãã
fmap
ã䜿çšããŠãããæžãæããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
main = do line <- fmap reverse getLine putStrLn $ "You said " ++ line ++ " backwards!" putStrLn $ "Yes, you really said" ++ line ++ " backwards!"
fmap reverse
ã§
Just "halb"
ã衚瀺ããŠ
Just "halb"
ååŸã§ãã
getLine
ã
fmap reverse
getLine
ã衚瀺ã§ããŸãã
getLine
ã¯ã
IO String
åã®I / Oã¢ã¯ã·ã§ã³ã§ããã
reverse
衚瀺ãããšãçŸå®äžçã«åºãŠæååãååŸãããã®çµæã«
reverse
ãé©çšããI / Oã¢ã¯ã·ã§ã³ãåŸãããŸãã
Maybe
ããã¯ã¹ã®å
åŽã«é¢æ°ãé©çšã§ããã®ãšåãæ¹æ³ã§ã
IO
ããã¯ã¹ã®å
åŽã«é¢æ°ãé©çšã§ããŸãããäœããååŸããã«ã¯å®äžçã«åºãå¿
èŠããããŸãã æ¬¡ã«ã
<-
ã䜿çšããŠçµæãååã«ãã€ã³ããããšãååã«ã¯ããã§ã«
reverse
ãé©çšãããçµæãåæ ãããŸãã
fmap (++"!") getLine
I / Oæäœ
fmap (++"!") getLine
ã¯
getLine
ãšãŸã£ããåãããã«åäœããŸãããçµæã«åžžã«
"!"
远å ãããŸã
"!"
æåŸãŸã§ïŒ
fmap
ã
IO
ã®ã¿ã§æ©èœããå Žåã
fmap :: (a -> b) -> IO a -> IO b
ãŸãã
fmap
ã¯é¢æ°ãšI / Oæäœãåãå
¥ããå€ãI / Oæäœã«äŒŒãæ°ããI / Oæäœãè¿ããŸãããããã«å«ãŸããçµæã«é¢æ°ãé©çšãããŸãã
颿°ãé©çšããããã ãã«I / Oæäœã®çµæãååã«é¢é£ä»ããæ¬¡ã®çµæã«å¥ã®ååãä»ãããšããç¶æ³ã«é¥ã£ãå Žåã¯ã
fmap
䜿çšãæ€èšããŠãã ããã ãã¡ã³ã¯ã¿ãŒå
ã®ããã€ãã®ããŒã¿ã«è€æ°ã®é¢æ°ãé©çšããå Žåãæäžäœã§é¢æ°ã宣èšããããã©ã ã颿°ãäœæããããçæ³çã«ã¯é¢æ°ã®æ§æã䜿çšã§ããŸãã
import Data.Char import Data.List main = do line <- fmap (intersperse '-' . reverse . map toUpper) getLine putStrLn line
ãã®ã³ãŒããå®è¡ããŠããã§ãhelloããšå
¥åãããšã次ã®ããã«ãªããŸãã
$ runhaskell fmapping_io hello there EREHT- -OLLEH
颿°ã
intersperse '-' . reverse . map toUpper
intersperse '-' . reverse . map toUpper
intersperse '-' . reverse . map toUpper
ã¯æååã
toUpper
ã
toUpper
ã§è¡šç€ºãããã®çµæã«
reverse
ãé©çšãããã®çµæã«
intersperse '-'
ãé©çšããŸãã ããã¯ã次ã®ã³ãŒããèšè¿°ããããçŸããæ¹æ³ã§ãã
(\xs -> intersperse '-' (reverse (map toUpper xs)))
ãã¡ã³ã¯ã¿ãŒãšããŠæ©èœ
ãããŸã§ãã£ãšæ±ã£ãŠããå¥ã®
Functor
ã€ã³ã¹ã¿ã³ã¹ã¯
(->) r
ã§ãã åŸ
ã£ãŠïŒ
(->) r
ã©ãããæå³ã§ããïŒ é¢æ°
r -> a
ã®åã¯ã
(+) 2 3
圢åŒã§
2 + 3
ãæžãããšãã§ããããã«ã
(->) ra
圢åŒã§æžãæããããšãã§ããŸãã
(->) ra
ãšããŠèªèããå Žå
(->)
ãããã«ç°ãªã芳ç¹ãã
(->)
ãŸãã ããã¯ã
Either
åæ§ã«ã2ã€ã®åãã©ã¡ãŒã¿ãŒããšãåçŽãªåã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã
ãã ããåã³ã³ã¹ãã©ã¯ã¿ãŒã
Functor
ã€ã³ã¹ã¿ã³ã¹ã«ã§ããããã«ãåã³ã³ã¹ãã©ã¯ã¿ãŒã¯1ã€ã®åãã©ã¡ãŒã¿ãŒã®ã¿ãåãå
¥ããå¿
èŠãããããšã«æ³šæããŠãã ããã ããã
Functor
ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããªã
(->)
çç±ã§ãã ãã ãã
(->) r
åã«éšåçã«é©çšããå Žåãããã¯åé¡ã«ã¯ãªããŸããã æ§æã§ã»ã¯ã·ã§ã³ã䜿çšããŠåã³ã³ã¹ãã©ã¯ã¿ãŒãéšåçã«é©çšã§ããå Žå
(2+)
å®è¡ããŠ
(2+)
å®è¡ããããšã§
+
ãé©çšããæ¹æ³ïŒã
(->) r
ã
(r->)
ãšããŠèšè¿°ã§ããŸãã
颿°ã¯ã©ã®ããã«æ©èœããŸããïŒ ã§ã¯ã
Control.Monad.Instances
ããå®è£
ãèŠãŠã¿ãŸãããã
instance Functor ((->) r) where fmap fg = (\x -> f (gx))
æåã«
fmap
ã¿ã€ãã«ã€ããŠèããŠã¿ãŸãããïŒ
fmap :: (a -> b) -> fa -> fb
次ã«ããã¡ã³ã¯ã¿ãŒã€ã³ã¹ã¿ã³ã¹ãæãã圹å²ã§ãããã¹ãŠã®
f
ã
(->) r
粟ç¥çã«çœ®ãæããŸãããã ããã«ããããã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã®å Žåã«
fmap
ãã©ã®ããã«åäœããããçè§£ã§ããŸãã çµæã¯æ¬¡ã®ãšããã§ãã
fmap :: (a -> b) -> ((->) ra) -> ((->) rb)
ããã§ãã¿ã€ã
(->) ra
ããã³
(->) rb
ãäžçœ®åœ¢åŒã§èšè¿°ã§ããŸãã
r -> a
ããã³
r -> b
ãéåžžé¢æ°ã§è¡ãããã«ïŒ
fmap :: (a -> b) -> (r -> a) -> (r -> b)
ããã ãã颿°ãå¥ã®é¢æ°ã«ãããã³ã°ãããšã
Maybe
ã颿°ã«ãããã³ã°ãããš
Maybe
ãçæããã颿°ãå«ããªã¹ãã衚瀺ãããšãªã¹ããçæãããããã«ã颿°ãçæãããŸãã åã®ã¿ã€ãã¯äœãæããŠãããŸããïŒ
a
ãã
b
ãžã®é¢æ°ãš
r
ãã
a
ãžã®é¢æ°ãåãã
r
ãã
b
ãžã®é¢æ°ãè¿ãããšãããããŸãã ããã¯äœããæãåºãããŸããïŒ ã¯ããæ©èœã®æ§æïŒ åºå
r -> a
ãå
¥åa-
a -> b
ããŠã颿°
r -> b
a -> b
ãååŸããŸããããã¯ããŸãã«é¢æ°ã®æ§æã§ãã ãã®ã€ã³ã¹ã¿ã³ã¹ãèšè¿°ããå¥ã®æ¹æ³ã次ã«ç€ºããŸãã
instance Functor ((->) r) where fmap = (.)
ãã®ã³ãŒãã«ããã颿°ãžã®
fmap
é©çšã¯åãªã颿°ã®åæã§ããããšãæç¢ºã«ãªããŸãã ã¹ã¯ãªããã§
Control.Monad.Instances
ã€ã³ããŒãããŸããããã¯ããã®ã€ã³ã¹ã¿ã³ã¹ãå®çŸ©ãããŠããã¢ãžã¥ãŒã«ã§ãããããã¹ã¯ãªãããããŒãããŠã颿°ã®è¡šç€ºã§éãã§ã¿ãŠãã ããã
ghci> :t fmap (*3) (+100) fmap (*3) (+100) :: (Num a) => a -> a ghci> fmap (*3) (+100) 1 303 ghci> (*3) `fmap` (+100) $ 1 303 ghci> (*3) . (+100) $ 1 303 ghci> fmap (show . (*3)) (*100) 1 "300"
fmap
ãäžçœ®é¢æ°ãšããŠåŒã³åºããŠãã«äŒŒããã®ã«ããããšãã§ããŸã
.
æç€ºçã§ããã å
¥åã®2è¡ç®ã«ã
(*3)
ã䜿çšããŠ
(+100)
ã衚瀺ããŸããããã¯ãå
¥åãåãå
¥ããããã«é©çš
(+100)
ããã®çµæã«é©çš
(*3)
ãã颿°ãæäŸããŸãã æ¬¡ã«ããã®é¢æ°ã
1
é©çšããŸãã
ãã¹ãŠã®ãã¡ã³ã¯ã¿ãŒãšåæ§ã«ã颿°ã¯ã³ã³ããã¹ããæã€å€ãšããŠèªèã§ããŸãã
(+3)
ãããªé¢æ°ãããå Žåãå€ã颿°ã®æçµçµæãšã¿ãªãããšãã§ããçµæãåŸãããã«ãã®é¢æ°ãäœãã«é©çšããå¿
èŠããããšããã³ã³ããã¹ãããããŸãã
fmap (*3)
ã
(+100)
é©çšãããšã
(+100)
ãšåãåããããå¥ã®é¢æ°ãäœæãããŸãããçµæãè¿ãåã«ããã®çµæã«
(*3)
ãé©çšãããŸãã
fmap
ã颿°ã«é©çšããããšãã«é¢æ°ã®æ§æã§ãããšããäºå®ã¯ãçŸæç¹ã§ã¯ããŸãæçšã§ã¯ãããŸããããå°ãªããšãéåžžã«è峿·±ããã®ã§ãã ãŸããå¿ãå°ãå€ãããããã¯ã¹ïŒ
IO
ããã³
(->) r
ïŒãããèšç®ã®ããã«æ¯ãèããšã³ãã£ãã£ããã¡ã³ã¯ã¿ãŒã«ãªãæ¹æ³ã確èªã§ããŸãã 颿°ã䜿çšããŠèšç®ã衚瀺ãããšãåãã¿ã€ãã®èšç®ãè¿ãããŸããããã®èšç®ã®çµæã¯é¢æ°ã«ãã£ãŠå€æŽãããŸãã

fmap
ãåŸãã¹ãæ³åã«ç§»ãåã«ã
fmap
ã¿ã€ãã«ã€ããŠããäžåºŠèããŠã¿ãŸãããã
fmap :: (a -> b) -> fa -> fb
第5ç« ã®ã«ãªãŒåããã颿°ã®æŠèŠã¯ãHaskellã®ãã¹ãŠã®é¢æ°ãå®éã«1ã€ã®ãã©ã¡ãŒã¿ãŒãåããšããã¹ããŒãã¡ã³ãããå§ãŸããŸããã 颿°
a -> b -> c
å®éã«ã¯ã¿ã€ã
a
ãã©ã¡ãŒã¿ãŒã1ã€ã ãåãåãããã®åŸé¢æ°
b -> c
ãè¿ã
c
ã颿°
b -> c
ã1ã€ã®ãã©ã¡ãŒã¿ãŒãåãåã
c
ãè¿ã
c
ã ãã®ããããã©ã¡ãŒã¿ãäžååãªé¢æ°ïŒãã®éšåçãªã¢ããªã±ãŒã·ã§ã³ïŒãåŒã³åºããšãã¹ãããããããã€ãã®ãã©ã¡ãŒã¿ãåãå
¥ãã颿°ãè¿ãããŸãïŒè€æ°ã®ãã©ã¡ãŒã¿ãåãå
¥ãããã®ããã«é¢æ°ãå床èªèããå ŽåïŒã ãããã£ãŠãa-
a -> (b -> c)
ãšæžããš
a -> (b -> c)
ã«ãªãŒåãããæç¢ºã«ãªããŸãã
åæ§ã«ã
fmap :: (a -> b) -> (fa -> fb)
ãæžããšã
fmap :: (a -> b) -> (fa -> fb)
ã¯1ã€ã®é¢æ°ãšãã¡ã³ã¯ã¿ãŒå€ãåãããã¡ã³ã¯ã¿ãŒå€ãè¿ã颿°ãšããŠã§ã¯ãªãã颿°ãšããŠèªèããããšãã§ããŸãã颿°ãåãåããåã®é¢æ°ãšåãæ°ãã颿°ãè¿ããŸãããã ãããã¡ã³ã¯ã¿ãŒå€ããã©ã¡ãŒã¿ãŒãšããŠåãåããçµæãšããŠãã¡ã³ã¯ã¿ãŒå€ãè¿ããŸãã 颿°
fa -> fb
a -> b
ãåãã颿°
fa -> fb
ãè¿ããŸãã ããã¯ããªããã£ã³ã°æ©èœããšåŒã°ããŸãã GHCiã®ïŒ
:t
ã³ãã³ãã䜿çšããŠããã®ã¢ã€ãã¢ã詊ããŠã¿ãŸãããã
ghci> :t fmap (*2) fmap (*2) :: (Num a, Functor f) => fa -> fa ghci> :t fmap (replicate 3) fmap (replicate 3) :: (Functor f) => fa -> f [a]
åŒ
fmap (*2)
ã¯ãæ°å€ã«å¯ŸããŠãã¡ã³ã¯ã¿ãŒ
f
ãåããæ°å€ã«å¯ŸããŠãã¡ã³ã¯ã¿ãŒãè¿ã颿°ã§ãã ãã®ãã¡ã³ã¯ã¿ãŒã¯ããªã¹ãã
Maybe
ã
Either String
ããŸãã¯ãã®ä»ã®
Either String
ãã§ãã åŒ
fmap (replicate 3)
ã¯ãä»»æã®ã¿ã€ãã®ãã¡ã³ã¯ã¿ãŒãåãåãããã®ã¿ã€ãã®èŠçŽ ã®ãªã¹ãã®ãã¡ã³ã¯ã¿ãŒãè¿ããŸãã ããã¯ãããšãã°
fmap (++"!")
ãéšåçã«é©çšããGHCiã®ååã«ãã€ã³ããããšããã«æçœã«ãªããŸãã
次ã®2ã€ã®æ¹æ³ã§
fmap
èªèã§ããŸãã
- 颿°ãšãã¡ã³ã¯ã¿ãŒå€ãåãããã®é¢æ°ã䜿çšããŠãã¡ã³ã¯ã¿ãŒå€ã«ããããã颿°ãšããŠ
- 颿°ãåãããã®ãªããã£ã³ã°ãå®è¡ãããã¡ã³ã¯ã¿ãŒã®å€ãæäœãã颿°ãšããŠ
äž¡æ¹ã®èŠç¹ãæ£ããã
ã¿ã€ã
fmap (replicate 3) :: (Functor f) => fa -> f [a]
ãã¡ã³ã¯ã¿ãŒ
fmap (replicate 3) :: (Functor f) => fa -> f [a]
ã¯ã颿°ãä»»æã®ãã¡ã³ã¯ã¿ãŒã§æ©èœããããšãæå³ããŸãã 圌女ãäœããããã¯ããã¡ã³ã¯ã¿ãŒæ¬¡ç¬¬ã§ãã ãªã¹ãã«
fmap (replicate 3)
ãé©çšãããšããªã¹ãã®
fmap
å®è£
ãéžæãã
map
ãã€ãŸãããã
map
ã§ãã
Maybe a
ã«é©çš
replicate 3
ãšã
Just
å
ã®å€ã«
replicate 3
ãé©çš
replicate 3
ããŸãã ãã®å€ã
Nothing
å Žåã
Nothing
ã«çãããªããŸãã 以äžã«äŸã瀺ããŸãã
ghci> fmap (replicate 3) [1,2,3,4] [[1,1,1],[2,2,2],[3,3,3],[4,4,4]] ghci> fmap (replicate 3) (Just 4) Just [4,4,4] ghci> fmap (replicate 3) (Right "blah") Right ["blah","blah","blah"] ghci> fmap (replicate 3) Nothing Nothing ghci> fmap (replicate 3) (Left "foo") Left "foo"
ãã¡ã³ã¯ã¿ãŒã®æ³å
ãã¹ãŠã®ãã¡ã³ã¯ã¿ãŒãç¹å®ã®ã¿ã€ãã®ããããã£ãšåäœã瀺ããšæ³å®ãããŸãã 衚瀺å¯èœãªãšã³ãã£ãã£ãšããŠç¢ºå®ã«åäœããå¿
èŠããããŸãã ãã¡ã³ã¯ã¿ãŒã«
fmap
ãé©çšãããšã颿°ãæã€ãã¡ã³ã¯ã¿ãŒã®ã¿ã衚瀺ããããã以äžã¯è¡šç€ºãããŸããã ãã®åäœã¯ããã¡ã³ã¯ã¿ãŒã®æ³åã§èª¬æãããŠããŸãã
Functor
ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã¯ãããã2ã€ã®æ³åŸã«åŸãå¿
èŠããããŸãã Haskellã¯ãããã®æ³åãèªåçã«å®è¡ããããšã匷å¶ããªãã®ã§ããã¡ã³ã¯ã¿ãŒãäœæãããšãã«èªåã§ãããããã§ãã¯ããå¿
èŠããããŸãã æšæºã©ã€ãã©ãªã®ãã¹ãŠã®
Functor
ã€ã³ã¹ã¿ã³ã¹ã¯ãããã®æ³åŸã«åŸããŸãã
第1å¹
ãã¡ã³ã¯ã¿ã®æåã®æ³åã¯ããã¡ã³ã¯ã¿ã®å€ã«
id
颿°ãé©çšããå ŽåãååŸãããã¡ã³ã¯ã¿ã®å€ã¯ãã¡ã³ã¯ã¿ã®å
ã®å€ãšåãã§ãªããã°ãªããªãããšã瀺ããŠããŸãã ããå°ãæ£åŒã«ã¯ãããã¯
fmap id = id
æå³ããŸãã åºæ¬çã«ãããã¯ã
fmap id
ããã¡ã³ã¯ã¿ãŒã®å€ã«é©çšããå Žåãåã«
id
ãå€ã«é©çšããã®ãšåãã§ããã¹ãã ãšèšããŸãã
id
ã¯ããã©ã¡ãŒã¿ã倿Žããã«åã«è¿ãã¢ã€ãã³ãã£ãã£é¢æ°ã§ããããšãæãåºããŠãã ããã
\x -> x
ãšæžãããšãã§ããŸãã ãã¡ã³ã¯ã¿ã®å€ã衚瀺å¯èœãªãã®ãšããŠãšããšã
fmap id = id
æ³åã¯éåžžã«ç°¡åã§æçœã«èŠããŸãã
ãã®æ³åããã¡ã³ã¯ã¿ãŒã®ããã€ãã®å€ã«åœãŠã¯ãŸããã©ããèŠãŠã¿ãŸãããã
ghci> fmap id (Just 3) Just 3 ghci> id (Just 3) Just 3 ghci> fmap id [1..5] [1,2,3,4,5] ghci> id [1..5] [1,2,3,4,5] ghci> fmap id [] [] ghci> fmap id Nothing Nothing
ããšãã°
Maybe
ã®
fmap
ã®å®è£
ãèŠããšããã¡ã³ã¯ã¿ãŒã®æåã®æ³åãæãç«ã€çç±ãçè§£ã§ããŸãã
instance Functor Maybe where fmap f (Just x) = Just (fx) fmap f Nothing = Nothing
ãã®å®è£
ã§ã¯ã
id
ããã©ã¡ãŒã¿ãŒ
f
圹å²ãæãããšèããããŸãã
fmap id
ã
Just x
é©çšãããšãçµæã¯
Just (id x)
ã«ãªãã
id
åã«ãã©ã¡ãŒã¿ãŒãè¿ãã ããªã®ã§ã
Just (id x)
ã¯
Just x
ãšçãããšçµè«ä»ããããšãã§ããŸãã ãããã£ãŠã
Just
å€ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠäœæããã
Maybe
å€ã«
id
ãé©çšãããšãåãå€ãè¿ãããããšãããããŸããã
id
ã
Nothing
é©çšãããšåãå€ãè¿ãããããšã¯ç°¡åã§ãã ãããã£ãŠã
fmap
ã®å®è£
ã«ãããããã2ã€ã®çåŒãããæ³å
fmap id = id
ãå°éãããããšãããããŸãã
第2å¹

2çªç®ã®æ³åã§ã¯ã2ã€ã®é¢æ°ãåæããçµæã®é¢æ°ããã¡ã³ã¯ã¿ãŒã«é©çšãããšãæåã®é¢æ°ããã¡ã³ã¯ã¿ãŒã«é©çšããŠããå¥ã®é¢æ°ãé©çšããã®ãšåãçµæãåŸãããŸãã æ£åŒãªè¡šèšã§ã¯ãããã¯
fmap (f . g) = fmap f . fmap g
æå³ã
fmap (f . g) = fmap f . fmap g
fmap (f . g) = fmap f . fmap g
ã ãŸãã¯ãå¥ã®æ¹æ³ã§èšè¿°ããå Žåããã¡ã³ã¯ã¿ãŒ
x
ä»»æã®å€
x
次ãæãç«ã€ã¯ãã§ãïŒ
fmap (f . g) x = fmap f (fmap gx)
ã
ç¹å®ã®ã¿ã€ãããã¡ã³ã¯ã¿ãŒã®2ã€ã®æ³åã«åŸãããšãç¹å®ã§ããã°ããããã³ã°ã«é¢ããŠã¯ä»ã®ãã¡ã³ã¯ã¿ãŒãšåãåºæ¬çãªåäœãæåŸ
ã§ããŸãã
fmap
ãé©çšãããšã衚瀺以å€ã®ã«ãŒãã³ã®èåŸã§ã¯äœãèµ·ãããã衚瀺å¯èœãªãšã³ãã£ãã£ãã€ãŸããã¡ã³ã¯ã¿ãŒãšããŠæ©èœããããšãããããŸãã
ç¹å®ã®åã®2çªç®ã®æ³åãã©ã®ããã«æãç«ã€ãã調ã¹ãã«ã¯ããã®åã®
fmap
å®è£
ãèŠãŠãæåã®æ³åã«åŸã£ãŠãããã©ã
Maybe
ã確èªããããã«äœ¿çšããæ¹æ³ã䜿çšããŸãã ãããã£ãŠããã¡ã³ã¯ã¿ãŒã®2çªç®ã®æ³åã
Maybe
ã«ã©ã®ããã«åœãŠã¯ãŸããã確èªããããã«ã
fmap (f . g)
ã
Nothing
ã«é©çšãããšã
Nothing
ãåŸãããŸãã
fmap f (fmap g Nothing)
ãå®è¡ãããšãåãçç±ã§
Nothing
ãååŸããŸãã
Maybe
å€ãçããå Žåã«2çªç®ã®æ³åãã©ã®ããã«æãç«ã€ããèŠãã®ã¯éåžžã«ç°¡åNothing
ã§ãããããããã®å€ãJust
ã©ããªãã®ã§ããããïŒç§ãã¡ãããªããã°ãŸããfmap (f . g) (Just x)
ãå®çŸããæã
ã¯ããã¯æ¬¡ã®ããã«å®è£
ãããŠããããšãããããŸãJust ((f . g) x)
åæ§ã®ãã®ãJust (f (gx))
ãæã
ãè¡ãå Žåã«ã¯fmap f (fmap g (Just x))
ãç§ãã¡ã«ã¯èŠãå®è£
ããããããfmap g (Just x)
ãããŸãJust (gx)
ããããã£ãŠãããfmap f (fmap g (Just x))
ã¯çããfmap f (Just (gx))
ã§ãããå®è£
ããã¯çããããšããããJust (f (gx))
ãŸãããã®èšŒæã«å°ãæ··ä¹±ããŠããŠãå¿é
ããªãã§ãã ããã颿°ã®æ§æãã©ã®ããã«æ©èœããããçè§£ããŠãã ãããåã¯ã³ã³ãããŸãã¯é¢æ°ã®ããã«æ©èœããããããããã®æ³åŸãã©ã®ããã«é©çšãããããçŽæçã«çè§£ã§ããããšããããããŸãããŸããã¿ã€ãã®ããã€ãã®ç°ãªãå€ã§ãããããã§ãã¯ããã¿ã€ããå®éã«ãããã®æ³åã«åŸã£ãŠããããšãããçšåºŠã®ç¢ºå®æ§ã§èšãããšãã§ããŸããæ³åŸéå
åã³ã³ã¹ãã©ã¯ã¿ãŒã®ç
çåŠçäŸãèŠãŠã¿ãŸããããããã¯Functoråã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããæ³åã«æºæ ããŠããªãããããã¡ã³ã¯ã¿ãŒã§ã¯ãããŸãããæ¬¡ã®ã¿ã€ãããããšããŸãã data CMaybe a = CNothing | CJust Int a deriving (Show)
C
ããã¯ã«ãŠã³ã¿ãŒã®ç¥ã§ããããã¯ããã¶ãaã«ãã䌌ãããŒã¿åã§ãäžéšã®ã¿Just
ã1ã€ã§ã¯ãªã2ã€ã®ãã£ãŒã«ããå«ãã§ããŸããå€ã³ã³ã¹ãã©ã¯ã¿ãŒã®æåã®ãã£ãŒã«ãCJust
ã¯åžžã«type Int
ãæã¡ãäžçš®ã®ã«ãŠã³ã¿ãŒã«ãªããŸãããŸãã2çªç®ã®ãã£ãŒã«ãã«ã¯a
typeãã©ã¡ãŒã¿ãŒããååŸããã¿ã€ããããããã®ã¿ã€ãã¯éžæããç¹å®ã®ã¿ã€ãã«äŸåããŸãCMaybe a
ãæ°ããã¿ã€ãã§éãã§ã¿ãŸãããïŒ ghci> CNothing CNothing ghci> CJust 0 "haha" CJust 0 "haha" ghci> :t CNothing CNothing :: CMaybe a ghci> :t CJust 0 "haha" CJust 0 "haha" :: CMaybe [Char] ghci> CJust 100 [1,2,3] CJust 100 [1,2,3]
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå ŽåCNothing
ããã£ãŒã«ãã¯ãããŸãããconstructorã䜿çšããå ŽåCJust
ãæåã®ãã£ãŒã«ãã¯æŽæ°ã§ããã2çªç®ã®ãã£ãŒã«ãã¯ä»»æã®ã¿ã€ãã§ãããã®åãã€ã³ã¹ã¿ã³ã¹ã«ããŠFunctor
ã䜿çšãããã³fmap
ã«é¢æ°ã2çªç®ã®ãã£ãŒã«ãã«é©çšãããæåã®ãã£ãŒã«ããã ãå¢å ããããã«ã1
ãŸãã instance Functor CMaybe where fmap f CNothing = CNothing fmap f (CJust counter x) = CJust (counter+1) (fx)
ããã¯ãã®ã€ã³ã¹ã¿ã³ã¹å®è£
ã«éšåçã«äŒŒãŠããŸããã空ã®ããã¯ã¹ïŒå€ïŒã衚ããªãå€Maybe
ã«é©çšfmap
ããå Žåã«ã®ã¿CJust
ãã³ã³ãã³ãã«é¢æ°ãé©çšããã ãã§ãªããã«ãŠã³ã¿ãå¢ãã1
ãŸãããããŸã§ã®ãšããããã¹ãŠãã¯ãŒã«ãªããã§ããããã§å°ãéã¶ããšãã§ããŸãïŒ ghci> fmap (++"ha") (CJust 0 "ho") CJust 1 "hoha" ghci> fmap (++"he") (fmap (++"ha") (CJust 0 "ho")) CJust 2 "hohahe" ghci> fmap (++"blah") CNothing CNothing
ãã®ã¿ã€ãã¯ãã¡ã³ã¯ã¿ãŒã®æ³åã«åŸããŸããïŒäœããæ³åŸã«åŸã£ãŠããªãããšã確èªããã«ã¯ãåäŸã1ã€ã ãèŠã€ããã ãã§ååã§ãã ghci> fmap id (CJust 0 "haha") CJust 1 "haha" ghci> id (CJust 0 "haha") CJust 0 "haha"
ãã¡ã³ã¯ã¿ãŒã®æåã®æ³åã瀺ãããã«ãidã䜿çšããŠãã¡ã³ã¯ã¿ãŒã®å€ã衚瀺ããå Žåããã¡ã³ã¯ã¿ãŒid
ã®åãå€ã§åŒã³åºãã ããšåãã«ãªããŸãããã®äŸã¯ãããããã¡ã³ã¯ã¿ãŒã«é©çšãããªãããšã瀺ããŠããŸãCMaybe
ãåclassã®äžéšã§ãããFunctor
ãã¡ã³ã¯ã¿ãŒã®æå®ã®æ³åã«åŸã£ãŠããªãããããã¡ã³ã¯ã¿ãŒã§ã¯ãããŸãããããCMaybe
ã¯ãã¡ã³ã¯ã¿ãŒã§ã¯ãªãã®ã§ã1ã€ã®ãµããããŸããããã¡ã³ã¯ã¿ãŒãšããŠäœ¿çšãããšãã³ãŒãã®èª€ãã«ã€ãªããå¯èœæ§ããããŸãããã¡ã³ã¯ã¿ã䜿çšããå Žåãæåã«ããã€ãã®é¢æ°ãæ§æããŠãããã¡ã³ã¯ã¿ã®å€ã衚瀺ããããå颿°ã§ãã¡ã³ã¯ã¿ã®å€ãåçŽã«è¡šç€ºãããã¯é¢ä¿ãããŸããããããã䜿çšããå ŽåCMaybe
衚瀺ãããåæ°ã远跡ãããããéèŠã§ããã¯ãŒã«ãããªãïŒç§ãã¡ããããå Žåã¯CMaybe
ãã¡ã³ã¯ã¿æ³åã«åŸããæã
ã䜿çšããŠããå Žåããã£ãŒã«ãã®Intã倿ŽãããŠããªãããšã確èªããå¿
èŠããããŸãfmap
ãæåã¯ããã¡ã³ã¯ã¿ãŒã®æ³åã¯å°ãæ··ä¹±ããŠäžå¿
èŠã«èŠãããããããŸãããããããããã¿ã€ããäž¡æ¹ã®æ³åŸã«åŸãããšãç¥ã£ãŠããå Žåããããã©ã®ããã«æ©èœãããã«ã€ããŠäžå®ã®ä»®å®ãç«ãŠãããšãã§ããŸããåããã¡ã³ã¯ã¿ãŒã®æ³åã«åŸãå Žåãfmap
ãã®åã®å€ãæã€åŒã³åºãã¯é¢æ°ã«ã®ã¿é©çšãããããšãç¥ã£ãŠããŸã-ãã以äžã¯äœãããŸãããããã«ãããæ³åã䜿çšããŠãã¡ã³ã¯ã¿ãŒã®åäœã倿ãããããã¡ã³ã¯ã¿ãŒã§ç¢ºå®ã«æ©èœãã颿°ãäœæãããã§ãããããããæœè±¡çã§æ¡åŒµæ§ã®é«ãã³ãŒãã«ãªããŸããæ¬¡ååãã€ã³ã¹ã¿ã³ã¹ã«ããFunctor
ãšãã¯ããã°ããããŠãã¡ã³ã¯ã¿ãŒã®æ³åãæºãããŠããããšã確èªããŠãã ãããå®è£
ã1è¡ãã€å®è¡ããŠãæ³ãå®ãããŠãããã©ããã確èªããããåäŸãèŠã€ãããããããšãã§ããŸããååãªæ°ã®ãã¡ã³ã¯ã¿ãŒãæ€èšããåŸããããã®å
±éã®ããããã£ãšåäœãåŠç¿ãããã®ã¿ã€ããŸãã¯ãã®ã¿ã€ãããã¡ã³ã¯ã¿ãŒã®æ³åã«åŸããã©ãããçŽæçã«çè§£ããŸããApplicative Functorã®äœ¿çš
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãæ¡åŒµãã¡ã³ã¯ã¿ãŒã§ããé©çšãã¡ã³ã¯ã¿ãŒãæ€èšããŸãããããŸã§ã1ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ããšã颿°ã䜿çšããŠãã¡ã³ã¯ã¿ãŒããããã³ã°ããããšã«çŠç¹ãåœãŠãŠããŸããããããã2ã€ã®ãã©ã¡ãŒã¿ãŒãåã颿°ã䜿çšããŠãã¡ã³ã¯ã¿ãŒã衚瀺ãããšã©ããªããŸããïŒããã€ãã®ç¹å®ã®äŸãèŠãŠã¿ãŸãããïŒæã£Just 3
ãŠããŠfmap (*) (Just 3)
ããã£ãŠããå ŽåãäœãåŸãããŸããïŒã€ã³ã¹ã¿ã³ã¹ã®å®è£
Maybe
ã®ããã«Functor
ãæã
ã¯ããã®å€ãããã°ãšããããšãç¥ã£ãŠJust
ã颿°ã¯å
éšã®å€ã«é©çšãããŸãJust
ããããã£ãŠãã»ã¯ã·ã§ã³ã䜿çšããå Žåãå®è¡fmap (*) (Just 3)
ã¯ãè¿ãJust ((*) 3)
ããã©ãŒã ã«æžã蟌ãããšãã§ãJust (3 *)
ãŸãããããããïŒ
颿°ãã©ããããJust
ãŸãïŒãã¡ã³ã¯ã¿ãŒå€å
ã®ããã€ãã®é¢æ°ã次ã«ç€ºããŸãã ghci> :t fmap (++) (Just "hey") fmap (++) (Just "hey") :: Maybe ([Char] -> [Char]) ghci> :t fmap compare (Just 'a') fmap compare (Just 'a') :: Maybe (Char -> Ordering) ghci> :t fmap compare "A LIST OF CHARS" fmap compare "A LIST OF CHARS" :: [Char -> Ordering] ghci> :t fmap (\xyz -> x + y / z) [3,4,5,6] fmap (\xyz -> x + y / z) [3,4,5,6] :: (Fractional a) => [a -> a -> a]
compare
type ã®ãããã«ãã䜿çšããŠæåã®ãªã¹ãã衚瀺ãããšã颿°ã¯ãªã¹ãå
ã®æåã䜿çšããŠéšåçã«é©çšãããããã(Ord a) => a -> a -> Ordering
typeã®é¢æ°ã®ãªã¹ããååŸããŸããããã¯ã¿ã€ã颿°ã®ãªã¹ãã§ã¯ãããŸãããæåã«é©çšãããã¿ã€ãããã£ãã®ã§ã2çªç®ãã¿ã€ããæã€ãã©ããæ±ºå®ããªããã°ãªããªãã®ã§ãChar -> Ordering
compare
(Ord a) => a -> Ordering
a
Char
a
Char
ããã«ããã©ã¡ãŒã¿ãŒã颿°ã®å©ããåããŠãã¡ã³ã¯ã¿ãŒã®å€ã衚瀺ããããèªäœã«é¢æ°ãå«ããã¡ã³ã¯ã¿ãŒã®å€ãååŸããæ¹æ³ã確èªããŸããããã§ãä»ãããã§äœãã§ããã§ããããïŒããšãã°ããããã®é¢æ°ããã©ã¡ãŒã¿ãŒãšããŠäœ¿çšãã颿°ã䜿çšããŠãããã衚瀺ã§ããŸãããã¡ã³ã¯ã¿ãŒã®å€ã«äœããã£ãŠãããã©ã¡ãŒã¿ãŒãšããŠè¡šç€ºãã颿°ã«æž¡ãããããã§ãã ghci> let a = fmap (*) [1,2,3,4] ghci> :ta a :: [Integer -> Integer] ghci> fmap (\f -> f 9) a [9,18,27,36]
ãããããã¡ã³ã¯ã¿ãŒå€Just (3 *)
ãšãã¡ã³ã¯ã¿ãŒå€Just 5
ãããã颿°ãæœåºãJust (3 *)
ãŠè¡šç€ºãããå Žåã¯Just 5
ã©ãã§ããããïŒéåžžã®ãã¡ã³ã¯ã¿ãŒã§ã¯ãéåžžã®é¢æ°ã䜿çšããŠæ¢åã®ãã¡ã³ã¯ã¿ãŒã®è¡šç€ºã®ã¿ããµããŒããããããããã¯æ©èœããŸããã颿°ãå«ããã¡ã³ã¯ã¿ãŒãã§è¡šç€ºããå Žåã§ãã\f -> f 9
åçŽã«éåžžã®é¢æ°ã§è¡šç€ºããŸãããããããç§ãã¡fmap
ã«æäŸãããã®ã䜿çšããŠããã¡ã³ã¯ã¿ãŒã®å€ã®äžã«ãã颿°ã®å©ããåããŠããã¡ã³ã¯ã¿ãŒã®å¥ã®å€ã衚瀺ããããšã¯ã§ããŸãããJust
ãµã³ãã«ã§ã³ã³ã¹ãã©ã¯ã¿ãŒãäžèŽãããŠããããã颿°ãæœåºããããã䜿çšããŠè¡šç€ºã§ããŸãJust 5
ãããã¡ã³ã¯ã¿ãŒã§æ©èœããããäžè¬çã§æœè±¡çãªã¢ãããŒããæ¢ããŠããŸããå¿çšãã¡ã³ã¯ã¿ãŒã«æšæ¶ãã
ã¢ãžã¥ãŒã«ã«ããApplicativeåã¯ã©ã¹ã«äŒããŸãControl.Applicative
ãããã¯2ã€ã®é¢æ°ãå®çŸ©ããŠããŸãpure
ãš<*>
ããããã®é¢æ°ã®ããã©ã«ãå®è£
ã¯æäŸãããªããããäœããé©çšå¯èœãªãã¡ã³ã¯ã¿ãŒã«ãããå Žåã¯ãäž¡æ¹ãå®çŸ©ããå¿
èŠããããŸãããã®ã¯ã©ã¹ã¯æ¬¡ã®ããã«å®çŸ©ãããŸãïŒ class (Functor f) => Applicative f where pure :: a -> fa (<*>) :: f (a -> b) -> fa -> fb
ãã®åçŽãª3è¡ã®ã¯ã©ã¹å®çŸ©ã¯ãå€ãã®ããšãæããŠãããŸãïŒæåã®è¡ã¯ã¯ã©ã¹å®çŸ©Applicative
ã§å§ãŸããã¯ã©ã¹å¶çŽãå°å
¥ããŸããåã³ã³ã¹ãã©ã¯ã¿ãŒãåã¯ã©ã¹ã®äžéšã«ãããå ŽåApplicative
ããŸãæåã«åã¯ã©ã¹ã«å±ããªããã°ãªããªããšããå¶éãããFunctor
ãŸãããã®ãããåã³ã³ã¹ãã©ã¯ã¿ãåã¯ã©ã¹ã«å±ããŠããããšãããã£ãŠããå Žåãåã¯ã©ã¹Applicative
ã«ãå±ããŠããFunctor
ãããããã«é©çšã§ããŸãfmap
ã圌ãå®çŸ©ããæåã®ã¡ãœããã¯ãšåŒã°ãpure
ãŸãã圌ã®ã¿ã€ãåºåã¯ã®ããã«èŠãpure :: a -> fa
ãŸããf
Applicative Functorã®ã€ã³ã¹ã¿ã³ã¹ã®åœ¹å²ãæãããŸãã Haskellã«ã¯éåžžã«åªããåã·ã¹ãã ãããã颿°ã§ã§ããããšã¯ãã©ã¡ãŒã¿ãŒãååŸããŠå€ãè¿ãã ããªã®ã§ãå宣èšã«ã€ããŠå€ãã®ããšãèšãããšãã§ãããã®åãäŸå€ã§ã¯ãããŸãããpure
ä»»æã®åã®å€ãåãããã®å€ãå
éšã«å«ãé©çšå¯èœãªå€ãè¿ãå¿
èŠããããŸãã ãå
éšããšããèªå¥ã¯ãããã¯ã¹ãšã®é¡äŒŒæ§ã瀺ããŠããŸãããåžžã«ãã¹ãã«åæ Œãããšã¯éããŸãããããããã¿ã€ãa -> fa
ã¯ãŸã ããªãæçœã§ããå€ãååŸããçµæãšããŠãã®å€ãå«ãé©çšå¯èœãªå€ã«ã©ããããŸããæ³åããããè¯ãæ¹æ³pure
-å€ãåããç¹å®ã®ããã©ã«ãã³ã³ããã¹ãïŒãŸãã¯çŽç²ãªã³ã³ããã¹ãïŒã«é
眮ãã-ã€ãŸãããã®å€ãè¿ãæå°ã³ã³ããã¹ãããã®æ©èœã¯<*>
æ¬åœã«è峿·±ãã§ãã圌女ã¯ãã®ã¿ã€ãå®çŸ©ãæã£ãŠããŸãïŒ f (a -> b) -> fa -> fb
äœãæãåºãããŸããïŒã®ããã«èŠããŸãfmap :: (a -> b) -> fa -> fb
ããã®æ©èœ<*>
ã¯äžçš®ã®æ¡åŒµæ©èœãšããŠçè§£ã§ãfmap
ãŸããäžæ¹fmap
ãã¡ã³ã¯ã¿ã®æ©èœãšæå³ãåãåããå€ã®ãã¡ã³ã¯ã¿å
ã«é¢æ°ãé©çšãã<*>
æ©èœãšå¥ã®ãã¡ã³ã¯ã¿ãå«ã¿ããããçšããŠç¬¬äºãã¡ã³ã¯ã¿ã衚瀺ããæåã®ãã¡ã³ã¯ã¿ããç¹åŸŽãæœåºããå€ã®ãã¡ã³ã¯ã¿ããšããŸããå¿çšãã¡ã³ã¯ã¿ãŒ
ã®ã€ã³ã¹ã¿ã³ã¹å®è£
Applicative
ãèŠãŠã¿ãŸãããMaybe
ã instance Applicative Maybe where pure = Just Nothing <*> _ = Nothing (Just f) <*> something = fmap f something
ç¹°ãè¿ããŸãããã¯ã©ã¹ã®å®çŸ©ãããf
ã¢ããªã±ãŒã·ã§ã³ãã¡ã³ã¯ã¿ã®åœ¹å²ãæãããããã©ã¡ãŒã¿ãšããŠ1ã€ã®ç¹å®ã®åããšãå¿
èŠããããããApplicative Maybe where
代ããã«instanceãèšè¿°ããããšãããããŸãinstance Applicative (Maybe a) where
ãããã«ãæã
ã¯æã£ãŠããŸãpure
ã颿°ã¯äœããåãå
¥ããé©çšå¯èœãªå€ã«ã©ããããå¿
èŠãããããšãæãåºããŠãã ãããpure = Just
å€ã³ã³ã¹ãã©ã¯ã¿ã¯Just
éåžžã®é¢æ°ã®ããã«èŠãããããæžããŸãããæžãããšãã§ããŸãpure x = Just x
ãæåŸã«ãå®çŸ©ããããŸã<*>
ãNothing
颿°ã¯å
éšã«ãªãããããã颿°ãæœåºã§ããŸããããããã£ãŠããã颿°ãæœåºããããšããNothing
ãšãçµæã¯ã«ãªããŸãNothing
ãã¯ã©ã¹å®çŸ©Applicative
ã«ã¯ã¯ã©ã¹å¶éããããŸãFunctor
ããã¯ã颿°ã®äž¡æ¹ã®ãã©ã¡ãŒã¿ãŒ<*>
ããã¡ã³ã¯ã¿ãŒå€ã§ãããšæ³å®ã§ããããšãæå³ããŸããæåã®åŒæ°ãã§ãªãNothing
ãJust
å
éšã«äœããã®é¢æ°ãããå Žåããã®é¢æ°ã§ã¯2çªç®ã®ãã©ã¡ãŒã¿ãŒã衚瀺ãããšèšããŸãããã®ã³ãŒãã¯Nothing
ãNothing
ã䜿çšãã颿°ã䜿çšãããããã³ã°fmap
ããè¿ãããã2çªç®ã®åŒæ°ãååšããå Žåã«ã察å¿ããŸãNothing
ããããã£ãŠãMaybe
颿°ã®å Žå<*>
ãå·ŠåŽã®å€ãã颿°ãæœåºãããããJust
ã§ããå Žåãå³åŽã®å€ã衚瀺ããŸãããã©ã¡ãŒã¿ã®ãããããã®å ŽåNothing
ãçµæã¯ã«ãªããŸãNothing
ãããã§ã¯è©ŠããŠã¿ãŸãããïŒ ghci> Just (+3) <*> Just 9 Just 12 ghci> pure (+3) <*> Just 10 Just 13 ghci> pure (+3) <*> Just 9 Just 12 ghci> Just (++"hahah") <*> Nothing Nothing ghci> Nothing <*> Just "woot" Nothing
ããªãã¯ã®å®è£
ããšãããããŸãpure (+3)
ããJust (+3)
ãã®å Žåã«ã¯ã -ããã¯åãããšã§ãã䜿çšpure
ããªããå€ãæ±ã£ãŠããå ŽåMaybe
ïŒãããã䜿çšããŠå¿çšçæèã§<*>
ïŒãããã§ãªããã°ã䜿çšã«åºå·ããŸãJust
ãå
¥åã®æåã®4è¡ã¯ã颿°ãã©ã®ããã«æœåºããã衚瀺ã«äœ¿çšããããã瀺ããŠããŸããããã®å Žåãããã¯åçŽã«ã©ãããããŠããªã颿°ããã¡ã³ã¯ã¿ãŒã«é©çšããããšã§å®çŸã§ããŸããæåŸã®è¡ã¯ããã颿°ãæœåºããNothing
ãã®å©ããåããŠäœãã衚瀺ããããšãããšããç¹ã§è峿·±ãNothing
ã§ããéåžžã®ãã¡ã³ã¯ã¿ãŒã䜿çšããŠãããšãã«é¢æ°ã䜿çšããŠãã¡ã³ã¯ã¿ãŒã衚瀺ãããšãçµæãéšåçã«é©çšããã颿°ã§ãã£ãŠããäžè¬çãªæ¹æ³ã§çµæãæœåºã§ããŸãããäžæ¹ãé©çšå¯èœãªãã¡ã³ã¯ã¿ãŒã䜿çšãããšãåäžã®é¢æ°ã䜿çšããŠè€æ°ã®ãã¡ã³ã¯ã¿ãŒãæäœã§ããŸããé©çšã¹ã¿ã€ã«
åã¯ã©ã¹ã䜿çšããå ŽåApplicative
ã颿°ã®äœ¿çšã<*>
ãã§ãŒã³ã«å
¥ããããšãã§ããŸããããã«ããã1ã€ã ãã§ãªãè€æ°ã®é©çšå¯èœãªå€ãäžåºŠã«ç°¡åã«æäœã§ããŸããããšãã°ããããèŠãŠãã ããïŒ ghci> pure (+) <*> Just 3 <*> Just 5 Just 8 ghci> pure (+) <*> Just 3 <*> Nothing Nothing ghci> pure (+) <*> Nothing <*> Just 5 Nothing
颿°+
ãé©çšå¯èœãªå€ã§ã©ããããããã䜿çš<*>
ããŠ2ã€ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠåŒã³åºããŸãããã©ã¡ãã®ãã©ã¡ãŒã¿ãŒãé©çšå¯èœãªå€ã§ãããããã©ã®ããã«èµ·ããã®ããäžæ©äžæ©èŠãŠã¿ãŸãããã<*>
å·Šçµåãã€ãŸãïŒ pure (+) <*> Just 3 <*> Just 5
ãããšåãïŒ (pure (+) <*> Just 3) <*> Just 5
æåã«ã颿°+
ã¯é©çšå¯èœãªå€ïŒãã®å ŽåMaybe
ã¯é¢æ°ãå«ãå€ïŒã«é
眮ãããŸãããã®ãããpure (+)
åºæ¬çã«ã¯åçJust (+)
ã§ããæ¬¡ã«ãåŒã³åºããçºçããŸãJust (+) <*> Just 3
ããã®çµæã¯Just (3+)
ã§ããããã¯ãéšåçãªã¢ããªã±ãŒã·ã§ã³ã«ãããã®ã§ãã3
颿°ã«ã®ã¿é©çšãããšã+
1ã€ã®ãã©ã¡ãŒã¿ãŒãåããããã«è¿œå ãã颿°ãè¿ãããŸã3
ãæåŸã«ããå®è¡Just (3+) <*> Just 5
ããresultãšããŠæ»ããŸãJust 8
ãããã¯çŽ æŽãããããšã§ã¯ãããŸãããïŒïŒé©çšå¯èœãªãã¡ã³ã¯ã¿ãŒãšé©çšå¯èœãªèšç®ã¹ã¿ã€ã«pure f <*> x <*> y <*> ...
é©çšå¯èœãªå€ã§ã¯ãªããã©ã¡ãŒã¿ãŒãæåŸ
ãã颿°ã䜿çšãããã®é¢æ°ã䜿çšããŠè€æ°ã®é©çšå¯èœãªå€ãæäœã§ããŸãã颿°ã¯ããªã«ã¬ã³ã¹éã§åžžã«éšåçã«é©çšããããããå¿
èŠãªæ°ã®ãã©ã¡ãŒã¿ãŒãåãããšãã§ããŸã<*>
ãçãããšããäºå®ãèæ
®ãããšãããã¯ããã«äŸ¿å©ã§æçœã«ãªããŸããããã¯é©çšæ³ã®1ã€ã§ãããã®ç« ã®åŸåã§é©çšæ³ã«ã€ããŠè©³ãã説æããŸãããããã§ã©ã®ããã«é©çšããããèããŠã¿ãŸããããpure f <*> x
fmap fx
pure
å€ãããã©ã«ãã®ã³ã³ããã¹ãã«å
¥ããŸãã颿°ãåã«ããã©ã«ãã®ã³ã³ããã¹ãã«é
眮ããŠããæœåºããå¥ã®ã¢ããªã«ãã£ããã¡ã³ã¯ã¿å
ã®å€ã«é©çšããå Žåããã®é¢æ°ã§ãã®ã¢ããªã«ãã£ããã¡ã³ã¯ã¿ãåã«è¡šç€ºããã®ãšåãã«ãªããŸããæžã代ããã«ãæžãpure f <*> x <*> y <*> ...
ããšãã§ããŸãfmap fx <*> y <*> ...
ãããããControl.Applicative
ãšãã颿°ããšã¯ã¹ããŒãããçç±ã§ããããã¯ãäžçœ®æŒç®åã®åœ¢åŒã®<$>
颿°fmap
ã§ããå®çŸ©æ¹æ³ã¯æ¬¡ã®ãšããã§ãã (<$>) :: (Functor f) => (a -> b) -> fa -> fb f <$> x = fmap fx
泚ïŒå倿°ã¯ããã©ã¡ãŒã¿ãŒåãä»ã®å€ã®ååãšã¯ç¡é¢ä¿ã§ããããšãæãåºããŠãã ãããããf
ã§ã颿°å®£èšã«ã¯ã¯ã©ã¹å¶çŽãæã€å倿°ããããŸããããã¯ã眮æããåã³ã³ã¹ãã©ã¯ã¿ãŒf
ã¯åclassã®äžéšã§ããå¿
èŠãããããšã瀺ããŠãFunctor
ãŸããf
颿°ã®æ¬äœã®ã¯ã衚瀺ã«äœ¿çšãã颿°ã瀺ããŸãx
ãf
äž¡æ¹ã®ããšã衚ãããã«äœ¿çšãããšããäºå®ã¯ãããããåããã®ã衚ãããšãæå³ãããã®ã§ã¯ãããŸããã䜿çšããå Žåã<$>
applicativeã¹ã¿ã€ã«ã¯ãã®æ å
ã®ãã¹ãŠã«çŸããŸãf
ã3ã€ã®applicativeå€ã«é¢æ°ãé©çšãããå Žåãæ¬¡ã®ããã«æžãããšãã§ããããã§ããf <$> x <*> y <*> z
ããã©ã¡ãŒã¿ãéåžžã®å€ã§ããå Žåããšèšè¿°ãfxyz
ãŸãããããã©ã®ããã«æ©èœãããã詳ããèŠãŠã¿ãŸããããæã
ã¯å€ãæ¥ç¶ãããšä»®å®Just "johntra"
ããJust "volta"
ãã¡ã³ã¯ã¿å
ã«ãã1è¡ã§Maybe
ããããè¡ãããšãã§ããŸãïŒ ghci> (++) <$> Just "johntra" <*> Just "volta" Just "johntravolta"
ãããã©ã®ããã«èµ·ããããèŠãåã«ãåã®è¡ãšãããæ¯èŒããŠãã ããïŒ ghci> (++) "johntra" "volta" "johntravolta"
Applicative Functorã§éåžžã®é¢æ°ã䜿çšããã«ã¯ãããã€ãã®<$>
ãšãæ£ãã°ã£<*>
ãŠãã ããã颿°ã¯Applicativeå€ãåŠçããApplicativeå€ãè¿ããŸããçŽ æŽãããã§ããç§ãã¡ã«æ»ã(++) <$> Just "johntra" <*> Just "volta"
ïŒæåã«(++)
ã(++) :: [a] -> [a] -> [a]
ãã£ã¹ãã¬ã€ã®ã¿ã€ãããããŸãJust "johntra"
ãããã«ããJust ("johntra"++)
ãtypeãšåãå€ãæã¡Maybe ([Char] -> [Char])
ãŸãã颿°ã®æåã®ãã©ã¡ãŒã¿ãŒã(++)
ã©ã®ããã«é£ã¹ãããã©ã®ããa
ã«å€ã«å€ãã£ããã«æ³šç®ããŠãã ããChar
ããããŠä»æºè¶³çºçŸJust ("johntra"++) <*> Just "volta"
ã®æ©èœãæœåºJust
ãããããçšããŠè¡šãJust "volta"
ããã®çµæãJust "johntravolta"
ã2ã€ã®å€ã®ãããããã®å ŽåNothing
ãçµæãæ¬¡ã®ããã«ãªããŸããNothing
ããªã¹ã
ãªã¹ãïŒå®éã«ã¯ãªã¹ãåã³ã³ã¹ãã©ã¯ã¿ãŒ[]
ïŒã¯ãé©çšå¯èœãªãã¡ã³ã¯ã¿ãŒã§ãããªããŠé©ãïŒãããŠãããã«[]
ã€ã³ã¹ã¿ã³ã¹ããããŸãApplicative
ïŒ instance Applicative [] where pure x = [x] fs <*> xs = [fx | f <- fs, x <- xs]
pure
å€ãåãããããããã©ã«ãã®ã³ã³ããã¹ãã«å
¥ããããšãæãåºããŠãã ãããã€ãŸãããã®å€ãè¿ãæå°éã®ã³ã³ããã¹ãã«é
眮ããŸãããªã¹ãã®æå°ã³ã³ããã¹ãã¯ç©ºã®ãªã¹ãã§ããã空ã®ãªã¹ãã¯å€ããªãããšãæå³ãããããé©çšããå€ãå«ããããšã¯ã§ããŸããpure
ããã®ããpure
ãå€ãååŸããŠã·ã³ã°ã«ãã³ãªã¹ãã«è¿œå ããŸããåæ§ã«ãå¿çšçãã¡ã³ã¯ã¿ã®æå°ã³ã³ããã¹ãMaybe
ã§ãããNothing
ããããã¯ä»£ããã«ãå€ã®å€ãååšããªãããšãæå³ããããpure
ã®ã€ã³ã¹ã¿ã³ã¹ã®å®è£
ã«ãããMaybe
ãšããŠå®çŸããŸãJust
ãããã§pure
ã®ã¢ã¯ã·ã§ã³ã§ïŒ ghci> pure "Hey" :: [String] ["Hey"] ghci> pure "Hey" :: Maybe String Just "Hey"
äœ<*>
ïŒé¢æ°ã®ã¿ã€ãã<*>
ãªã¹ãã®ã¿ã«å¶éãããŠããå ŽåããååŸã(<*>) :: [a -> b] -> [a] -> [b]
ãŸãããã®é¢æ°ã¯ããªã¹ããžã§ãã¬ãŒã¿ãŒã«ãã£ãŠå®è£
ãããŸãã<*>
äœããã®æ¹æ³ã§ãã®å·ŠåŽã®ãã©ã¡ãŒã¿ãŒãã颿°ãæœåºãããã®ãã«ãã䜿çšããŠå³åŽã®ãã©ã¡ãŒã¿ãŒã衚瀺ããå¿
èŠããããŸãããã ããå·Šã®ãªã¹ãã«ã¯é¢æ°ãå«ãŸããŠããªããã1ã€ã®é¢æ°ãŸãã¯è€æ°ã®é¢æ°ãå«ãŸããŠããå Žåããããå³ã®ãªã¹ãã«ã¯è€æ°ã®å€ãå«ãŸããŠããå ŽåããããŸãããã®ããããªã¹ããžã§ãã¬ãŒã¿ãŒã䜿çšããŠäž¡æ¹ã®ãªã¹ãããæœåºããŸããå·Šã®ãªã¹ãããå¯èœãªãã¹ãŠã®é¢æ°ããå³ã®ãªã¹ãããå¯èœãªãã¹ãŠã®å€ã«é©çšããŸããçµæã®ãªã¹ãã«ã¯ãå·Šã®ãªã¹ãã®é¢æ°ãå³ã®å€ã«é©çšãããã¹ãŠã®å¯èœãªçµã¿åãããå«ãŸããŠããŸããæ¬¡ã®<*>
ãããªãªã¹ãã§äœ¿çšã§ããŸãã ghci> [(*0),(+100),(^2)] <*> [1,2,3] [0,0,0,101,102,103,1,4,9]
å·Šã®ãªã¹ãã«ã¯3ã€ã®é¢æ°ãå«ãŸããå³ã®ãªã¹ãã«ã¯3ã€ã®å€ãå«ãŸãããããçµæã®ãªã¹ãã«ã¯9ã€ã®èŠçŽ ãå«ãŸããŸããå·Šã®ãªã¹ãã®å颿°ã¯ãå³ã®åèŠçŽ ã«é©çšãããŸãã2ã€ã®ãã©ã¡ãŒã¿ãŒãåã颿°ã®ãªã¹ããããå Žåã2ã€ã®ãªã¹ãã®éã«ãããã®é¢æ°ãé©çšã§ããŸããæ¬¡ã®äŸã§ã¯ã2ã€ã®ãªã¹ãã®éã«2ã€ã®é¢æ°ãé©çšããŸãã ghci> [(+),(*)] <*> [1,2] <*> [3,4] [4,5,5,6,3,4,6,8]
<*>
å·ŠåŽã®å颿°ã¯å³åŽã®åå€ã«é©çšããããããå·Šçµåã§ãããããæåã«å®è¡ãã[(+),(*)] <*> [1,2]
ããšåããªã¹ã[(1+),(2+),(1*),(2*)]
ãäœæãããŸãããã®åŸ[(1+),(2+),(1*),(2*)] <*> [3,4]
ãæçµçµæãè¿ãå®è¡ãããŸãããªã¹ãã§applicativeã¹ã¿ã€ã«ã䜿çšããã®ã¯çŽ æŽãããããšã§ãïŒ ghci> (++) <$> ["ha","heh","hmm"] <*> ["?","!","."] ["ha?","ha!","ha.","heh?","heh!","heh.","hmm?","hmm!","hmm."]
ãã®å Žåãã察å¿ããé©çšæŒç®åãæ¿å
¥ããã ãã§ã2ã€ã®è¡ã®ãªã¹ãã®éã«2è¡ãåãéåžžã®é¢æ°ã䜿çšããŸããããªã¹ãã¯é決å®çãªèšç®ãšèããããšãã§ããŸãã100
ãŸãã¯ãªã©ã®å€"what"
ã¯ãçµæã1ã€ãã[1,2,3]
ãªã決å®è«çèšç®ãšèŠãªãããšãã§ããŸããããªã¹ãã®ãããªå€ã¯ãã©ã®çµæãå¿
èŠãã倿ã§ããªãèšç®ãšèŠãªãããšãã§ããããããã¹ãŠã®å¯èœãªçµæãè¿ãããŸãããããã£ãŠããã®ãããªãã®ãèšè¿°ããå Žåãçµæãããã«äžç¢ºå®ãªå¥ã®é決å®çèšç®ãäœæããããšã(+) <$> [1,2,3] <*> [4,5,6]
å¯äžã®+
ç®çãšããã2ã€ã®é決å®çèšç®ã®çµã¿åãããšèããããšãã§ããŸããå€ãã®å Žåããªã¹ãã§ã¢ããªã±ãŒã·ã§ã³ã¹ã¿ã€ã«ã䜿çšãããšããªã¹ããžã§ãã¬ãŒã¿ãŒã®ä»£ããã«ãªããŸãã第1ç« ã§ã¯ãäœå[2,5,10]
ãšã®å¯èœãªçµã¿åããããã¹ãŠèŠããã£ã[8,10,11]
ã®ã§ã次ã®ããã«ããŸããã ghci> [ x*y | x <- [2,5,10], y <- [8,10,11]] [16,20,22,40,50,55,80,100,110]
äž¡æ¹ã®ãªã¹ãããå€ãæœåºããèŠçŽ ã®åçµã¿åããã®éã«é¢æ°ãé©çšããã ãã§ããããã¯ãé©çšã¹ã¿ã€ã«ã§ãå®è¡ã§ããŸãã ghci> (*) <$> [2,5,10] <*> [8,10,11] [16,20,22,40,50,55,80,100,110]
ç§ã«ãšã£ãŠããã®ã¢ãããŒãã¯ããçè§£ãããããã®ã§ãããªããªã*
ã2ã€ã®é決å®çèšç®ã®éã§åã«åŒãã§ãããã®ãçè§£ããã®ãç°¡åã ããã§ããããã2ã€ã®ãªã¹ãã®èŠçŽ ã§ããlargeã®ãã¹ãŠã®å¯èœãªç©ãååŸã50
ããå Žåã以äžã䜿çšããŸãã ghci> filter (>50) $ (*) <$> [2,5,10] <*> [8,10,11] [55,80,100,110]
pure f <*> xs
ãªã¹ãã䜿çšãããšãã®åŒã³åºããåçã§ããããšã¯ç°¡åã«ããããŸãfmap f xs
ãpure f
-ã·ã³ãã«[f]
ã§ãã[f] <*> xs
ãå·Šã®ãªã¹ãã®å颿°ãå³ã®åå€ã«é©çšããŸãããå·Šã®ãªã¹ãã«ã¯é¢æ°ã1ã€ãããªãããã衚瀺ã®ããã«èŠããŸããIOã¯é©çšå¯èœãªãã¡ã³ã¯ã¿ãŒã§ããããŸã
Applicative
ç§ãã¡ããã§ã«äŒã£ããã1ã€ã®äŸã¯IO
ã§ãããã®ã€ã³ã¹ã¿ã³ã¹ã®å®è£
æ¹æ³ã¯æ¬¡ã®ãšããã§ãã instance Applicative IO where pure = return a <*> b = do f <- a x <- b return (fx)
æ¬è³ªpure
ã¯ãçµæãšããŠå€ãå«ãæå°éã®ã³ã³ããã¹ãã«å€ãé
眮ããããšã§ãããããpure
åçŽã§ããããšãè«ççã§ãreturn
ãreturn
äœãããªãI / Oã¢ã¯ã·ã§ã³ãäœæããŸãã端æ«ãžã®å°å·ããã¡ã€ã«ããã®èªã¿åããªã©ã®å
¥åºåæäœãå®è¡ããã«ãçµæãšããŠäœããã®å€ãè¿ãã ãã§ããç§ã<*>
åãããšã«éãããŠããã°IO
ã圌女ã¯ã¿ã€ããæã€ã§ããã(<*>) :: IO (a -> b) -> IO a -> IO b
ãã®å Žåã颿°ãè¿ãIO
I / Oã¢ã¯ã·ã§ã³a
ãåããI / Oã¢ã¯ã·ã§ã³ãå®è¡ãããã®é¢æ°ãã«é¢é£ä»ããŸãf
ãæ¬¡ã«ãI / Oã¢ã¯ã·ã§ã³b
ãå®è¡ãããã®çµæãã«é¢é£ä»ãx
ãŸããæåŸã«ã圌女ã¯é¢æ°ãé©çšããŸãf
k x
ããã³çµæãšããŠãã®ã¢ããªã±ãŒã·ã§ã³ã®çµæãè¿ããŸãããããå®è£
ããããã«ãããã§æ§æã䜿çšããŸããdo
ã ïŒæ§æã®æ¬è³ªã¯ãdo
è€æ°ã®I / Oã¢ã¯ã·ã§ã³ãåãããããã1ã€ã®ã¢ã¯ã·ã§ã³ã«çµåããããšã§ããïŒandã䜿çšããå Žåã颿°ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãå·ŠåŽã®ãã©ã¡ãŒã¿ãŒãã颿°ãæœåºãããããå³åŽã«é©çšãããã®ãšããŠèªèã§ããŸããã©ã¡ãŒã¿ãã«ã€ããŠMaybe
[]
<*>
IO
æœåºã¯æå¹ãªãŸãŸã§ããã2ã€ã®I / Oã¢ã¯ã·ã§ã³ãå®è¡ããŠãããã1ã€ã«çµåãããããæœåºãé çªã«è¡ããšããæŠå¿µããããŸããæåã®I / Oã¢ã¯ã·ã§ã³ãã颿°ãæœåºããå¿
èŠããããŸãããI / Oã¢ã¯ã·ã§ã³ããçµæãæœåºããã«ã¯ãåŸè
ãå®è¡ããå¿
èŠããããŸãããããèããŠãã ããïŒ myAction :: IO String myAction = do a <- getLine b <- getLine return $ a ++ b
ããã¯ããŠãŒã¶ãŒã«2è¡ãèŠæ±ããçµæãšããŠããã2è¡ã®é£çµãè¿ãI / Oã¢ã¯ã·ã§ã³ã§ãã2ã€ã®I / Oã¢ã¯ã·ã§ã³getLine
ãçµåããããšã§ãããéæããŸãããreturn
æ°ããæ¥çãããI / Oã¢ã¯ã·ã§ã³ã«å®è¡çµæãå«ããå¿
èŠãããããã§ãa ++ b
ããããç¶Žããã1ã€ã®æ¹æ³ã¯ãapplicativeã¹ã¿ã€ã«ã䜿çšããããšã§ãã myAction :: IO String myAction = (++) <$> getLine <*> getLine
ããã¯ãä»ã®2ã€ã®I / Oã¢ã¯ã·ã§ã³ã®çµæã®éã«é¢æ°ãé©çšããI / Oã¢ã¯ã·ã§ã³ãäœæãããšããšåãããšã§ããgetLine
ããã¯ãã¿ã€ããæã€I / Oã¢ã¯ã·ã§ã³ã§ããããšãæãåºããŠãã ããgetLine :: IO String
ã<*>
2ã€ã®é©çšå¯èœãªå€ã®éã§é©çšããå Žåãçµæã¯é©çšå¯èœãªå€ã§ããããããã¹ãŠãçã«ããªã£ãŠããŸããããã¯ã¹ã®é¡æšã«æ»ããšãããgetLine
ã¯çŸå®ã®äžçã«å
¥ãèŸŒã¿æååãããããããã¯ã¹ãšããŠæ³åã§ããŸããå®è¡(++) <$> getLine <*> getLine
ãããšãå¥ã®å€§ããªããã¯ã¹ãäœæããã2ã€ã®ããã¯ã¹ã端æ«ããæååãåä¿¡ããããã«éä¿¡ãããçµæãšããŠããã2ã€ã®æååã®é£çµãè¿ãããŸããåŒ(++) <$> getLine <*> getLine
ã¯ã¿ã€ãã§ãIO String
ãããã¯ããã®åŒãä»ã®å
¥åºåã¢ã¯ã·ã§ã³ãšåæ§ã«å®å
šã«éåžžã®å
¥åºåã¢ã¯ã·ã§ã³ã§ãããçµæã®å€ãè¿ãããšãæå³ããŸãããããããã®ãããªããšãã§ããçç±ã§ãã main = do a <- (++) <$> getLine <*> getLine putStrLn $ "The two lines concatenated turn out to be: " ++ a
Applicative FunctorãšããŠæ©èœ
å¥ã®ã€ã³ã¹ã¿ã³ã¹Applicative
ã¯(->) r
ãŸãã¯ã§ããã¢ããªã±ãŒã·ã§ã³ã¹ã¿ã€ã«ã§é¢æ°ã䜿çšããããšã¯ããŸããããŸããããããã§ãæŠå¿µã¯éåžžã«è峿·±ãã®ã§ã颿°ã€ã³ã¹ã¿ã³ã¹ã®å®è£
æ¹æ³ãèŠãŠã¿ãŸãããã instance Applicative ((->) r) where pure x = (\_ -> x) f <*> g = \x -> fx (gx)
å€ãapplicativeå€ã§ã©ãããããšpure
ãè¿ãããçµæã¯ãã®å€ã«ãªããŸããæå°ã®ããã©ã«ãã³ã³ããã¹ãã¯ãçµæãšããŠãã®å€ãè¿ããŸãããã®ããã颿°ã€ã³ã¹ã¿ã³ã¹ã®å®è£
ã§pure
ã¯ãå€ãåãåããæž¡ããããã©ã¡ãŒã¿ãŒãç¡èŠããŠåžžã«ãã®å€ãè¿ã颿°ãäœæããŸããpure
ã€ã³ã¹ã¿ã³ã¹ã®ã¿ã€ãã¯(->) r
次ã®ããã«ãªãpure :: a -> (r -> a)
ãŸãã ghci> (pure 3) "blah" 3
ã«ãªãŒåã®ããã颿°ã®é©çšã¯å·Šçµåãªã®ã§ãæ¬åŒ§ãçç¥ã§ããŸãã ghci> pure 3 "blah" 3
ã€ã³ã¹ã¿ã³ã¹ã®å®è£
ã¯<*>
å°ããããã«ããã®ã§ã颿°ãã¢ããªã«ãã£ãã¹ã¿ã€ã«ã®ã¢ããªã«ãã£ããã¡ã³ã¯ã¿ãšããŠäœ¿çšããæ¹æ³ãèŠãŠã¿ãŸãããã ghci> :t (+) <$> (+3) <*> (*100) (+) <$> (+3) <*> (*100) :: (Num a) => a -> a ghci> (+) <$> (+3) <*> (*100) $ 5 508
<*>
2ã€ã®applicativeå€ãæã€é¢æ°åŒã³åºãã¯applicativeå€ãè¿ãããã2ã€ã®é¢æ°ã§åŒã³åºããšé¢æ°ãåŸãããŸããããã§äœãèµ·ãã£ãŠããŸããïŒæã
ãè¡ããšã(+) <$> (+3) <*> (*100)
ãç§ãã¡ã¯é©çšããã颿°ã®äœæ+
颿°ã®çµæã«(+3)
ããŠ(*100)
ããã®å€ãè¿ããŸããåŒã³åºããããšã(+) <$> (+3) <*> (*100) $ 5
ã(+3)
ããã³ã(*100)
æåã«é©çšãã5
ãçµæã¯8
ããã³ã«ãªã500
ãŸããæ¬¡ã«+
ãå€8
ãš500
ã§åŒã³åºãããŸã508
ãæ¬¡ã®ã³ãŒãã¯äŒŒãŠããŸãã ghci> (\xyz -> [x,y,z]) <$> (+3) <*> (*2) <*> (/2) $ 5 [8.0,10.0,2.5]

\xyz -> [x, y, z]
æçµçãªå®è¡çµæãè¿ããã颿°(+3)
ã(*2)
ããã³ã§é¢æ°ãåŒã³åºã颿°ãäœæããŸã(/2)
ã5
3ã€ã®é¢æ°ã®ããããã«æž¡ããããããã®çµæã§åŒã³åºãããŸã\xyz -> [x, y, z]
ãæ³šïŒã€ã³ã¹ã¿ã³ã¹ãã©ã®ããã«æ©èœããããçè§£ããŠãåé¡ãããŸããããã®(->) r
ããApplicative
ãä»çè§£ããŠããªãå Žåã§ãçµ¶æããªãã§ãã ãããã¢ããªã«ãã£ãã¹ã¿ã€ã«ãšé¢æ°ã詊ããŠã颿°ãã¢ããªã«ãã£ããã¡ã³ã¯ã¿ãšããŠäœ¿çšããæ¹æ³ãçè§£ããŠãã ãããå§çž®ãªã¹ã
ãªã¹ããé©çšå¯èœãªãã¡ã³ã¯ã¿ãŒã«ãªãä»ã®æ¹æ³ãããããšãããããŸããæ¢ã«1ã€ã®æ¹æ³ãæ€èš<*>
ããŸããã颿°ã®ãªã¹ããšå€ã®ãªã¹ãã䜿çšããåŒã³åºãã§ããããã¯ãå·ŠåŽã®ãªã¹ãããå³åŽã®ãªã¹ãã®å€ã«é¢æ°ãé©çšãããã¹ãŠã®å¯èœãªçµã¿åããã®ãªã¹ããè¿ããŸããç§ãã¡ãããªããã°ãäŸãã°[(+3),(*2)] <*> [1,2]
ãæ©èœã¯(+3)
äž¡æ¹ã«é©çšããã1
ãš2
ããã®é¢æ°ã¯(*2)
ãŸããäž¡æ¹ã«é©çšãããŸã1
ãšã2
4ã€ã®èŠçŽ ã®ãªã¹ãã«ãªããŸããŸãããïŒã[4,5,2,4]
ãã ãã[(+3),(*2)] <*> [1,2]
å·ŠåŽã®ãªã¹ãã®æåã®é¢æ°ãå³åŽã®ãªã¹ãã®æåã®å€ã«é©çšããã2çªç®ã®é¢æ°ã2çªç®ã®å€ã«é©çšããããªã©ã®æ¹æ³ã§ãæ©èœããŸããããã«ããã2ã€ã®å€ãæã€ãªã¹ããè¿ãããŸãã[4,4]
ãããªãã¯ãããæ³åããããšãã§ã[1 + 3, 2 * 2]
ãŸããç§ãã¡ããŸã äŒã£ãŠããªãã€ã³ã¹ã¿ã³ã¹Applicative
ãZipList
ããã圌ã¯äœãã§ãControl.Applicative
ãŸãã1ã€ã®åãåãåã¯ã©ã¹ã«å¯ŸããŠ2ã€ã®ã€ã³ã¹ã¿ã³ã¹ãæã€ããšã¯ã§ããªããããZipList a
1ã€ã®(ZipList)
ãã£ãŒã«ãïŒãªã¹ãïŒãæã€1ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãååšããåãå°å
¥ãããŸãããã€ã³ã¹ã¿ã³ã¹ã¯æ¬¡ã®ãšããã§ãã instance Applicative ZipList where pure x = ZipList (repeat x) ZipList fs <*> ZipList xs = ZipList (zipWith (\fx -> fx) fs xs)
<*>
æåã®é¢æ°ãæåã®å€ã«é©çšãã2çªç®ã®é¢æ°ã2çªç®ã®å€ã«é©çšããŸããããã¯ã§è¡ãzipWith (\fx -> fx) fs xs
ãŸãããžã§ãã®æ§è³ªã«ãããzipWith
æçµãªã¹ãã¯2ã€ã®çããªã¹ããšåãé·ãã«ãªããŸããpure
ãããé¢çœãã§ãã圌女ã¯å€ãåãããã®å€ãåçŽã«ç¡éã«ç¹°ãè¿ããããªã¹ãã«ããã眮ããŸããpure "haha"
æ»ãZipList (["haha","haha","haha"...
ãŸãããã®pure
å€ãè¿ãæå°ã®ã³ã³ããã¹ãã«å€ãé
眮ããå¿
èŠãããããšãåŠç¿ãããããããã¯æ··ä¹±ãæãå¯èœæ§ããããŸãããããŠãããªãã¯äœãã®ç¡éã®ãªã¹ããã»ãšãã©æå°éã§ãããšæãã§ãããããã ããzipããããªã¹ãã䜿çšããå Žåã¯ãåäœçœ®ã§å€ãçæããå¿
èŠããããããããã¯çã«ããªã£ãŠããŸãããŸãã以äžã®æ³åŸã«ãæºæ ããŠããŸããpure f <*> xs
åçã§ããå¿
èŠããããŸãfmap f xs
ãåŒã³åºããpure 3
åã«è¿ãããå Žåã2ã€ã®zipããããªã¹ãã®çµæãªã¹ãã®é·ãã¯2ã€ã®çããªã¹ãã®é·ããªã®ã§ZipList [3]
ãåŒã³åºãpure (*2) <*> ZipList [1,5,10]
ã¯çµæãšãªãZipList [2]
ãŸããç¡éã®ãªã¹ããå§çž®ãããšãçµæã®ãªã¹ãã®é·ãã¯åžžã«æçµãªã¹ãã®é·ããšçãããªããŸããã§ã¯ãzip圢åŒã®ãªã¹ãã¯ã©ã®ããã«é©çšå¯èœãªã¹ã¿ã€ã«ã§æ©èœããŸããïŒèŠãŠã¿ãŸããããã¿ã€ãã«ZipList a
ã¯instanceãShow
ãªãããã颿°getZipList
ã䜿çšããŠå§çž®ãªã¹ãããçãªã¹ããæœåºããå¿
èŠããããŸãã ghci> getZipList $ (+) <$> ZipList [1,2,3] <*> ZipList [100,100,100] [101,102,103] ghci> getZipList $ (+) <$> ZipList [1,2,3] <*> ZipList [100,100..] [101,102,103] ghci> getZipList $ max <$> ZipList [1,2,3,4,5,3] <*> ZipList [5,3,1,2] [5,3,3,4] ghci> getZipList $ (,,) <$> ZipList "dog" <*> ZipList "cat" <*> ZipList "rat" [('d','c','r'),('o','a','a'),('g','t','t')]
æ³šïŒæ©èœ(,,)
ã¯ãšåã\xyz -> (x,y,z)
ã§ãããŸãã颿°(,)
ã¯ãšåã\xy -> (x,y)
ã§ããå ããŠãzipWith
æšæºã©ã€ãã©ãªã®ãããªæ©èœãæã£ãŠããzipWith3
ãzipWith4
ãŸã§ã7
ãzipWith
2ã€ã®ãã©ã¡ãŒã¿ãŒãåãåã颿°ã䜿çšãã2ã€ã®ãªã¹ããããã§åºå®ããŸããzipWith3
ã¯ã3ã€ã®ãã©ã¡ãŒã¿ãŒãåãåãã3ã€ã®ãªã¹ããããã§åºå®ãã颿°ãåããŸããé©çšã¹ã¿ã€ã«ã§åºå®ãªã¹ãã䜿çšããå Žåãäºãã«åºå®ãããªã¹ãã®æ°ããšã«åå¥ã®åºå®æ©èœãçšæããå¿
èŠã¯ãããŸããã颿°ã䜿çšããŠãapplicativeã¹ã¿ã€ã«ã䜿çšããŠä»»æã®æ°ã®ãªã¹ããäºãã«åºå®ããã ãã§ããããã¯éåžžã«äŸ¿å©ã§ããé©çšæ³
éåžžã®ãã¡ã³ã¯ã¿ãŒã®ããã«ãé©çšãã¡ã³ã¯ã¿ãŒã«ã¯ããã€ãã®æ³åããããŸããæãéèŠãªæ³åŸã¯å®æœãããããšpure f <*> x = fmap fx
ã§ããæŒç¿ãšããŠããã®ç« ã®äžéšã®é©çšãã¡ã³ã¯ã¿ãŒã«ã€ããŠããã®æ³åãæºããããŠããããšã蚌æã§ããŸãããã®ä»ã®é©çšæ³ã¯ä»¥äžã®ãšããã§ããpure id <*> v = v
pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
pure f <*> pure x = pure (fx)
u <*> pure y = pure ($ y) <*> u
å€ãã®ããŒãžãå¿
èŠãšããããéå±ã«ãªãã®ã§ãããããè©³çŽ°ã«æ€èšããŸãããèå³ãããå Žåã¯ãããããããããç¥ããããã€ãã®ã€ã³ã¹ã¿ã³ã¹ã§å®è¡ããããã©ããã確èªã§ããŸããApplicative Functorãæäœããããã®äŸ¿å©ãªé¢æ°
Control.Applicative
åŒã³åºããliftA2
ãæ¬¡ã®ã¿ã€ãã®é¢æ°ãå®çŸ©ããŸãã liftA2 :: (Applicative f) => (a -> b -> c) -> fa -> fb -> fc
次ã®ããã«å®çŸ©ãããŸãã liftA2 :: (Applicative f) => (a -> b -> c) -> fa -> fb -> fc liftA2 fab = f <$> a <*> b
ããã¯ã2ã€ã®é©çšå¯èœãªå€ã®éã«é¢æ°ãé©çšããã ãã§ã説æããé©çšå¯èœãªã¹ã¿ã€ã«ãé衚瀺ã«ããŸãããã ããé©çšãã¡ã³ã¯ã¿ãéåžžã®ãã¡ã³ã¯ã¿ããã匷åã§ããçç±ãæç¢ºã«ç€ºããŠããŸããéåžžã®ãã¡ã³ã¯ã¿ãŒã䜿çšããå Žåã颿°ã䜿çšããŠåäžã®ãã¡ã³ã¯ã¿ãŒå€ãç°¡åã«è¡šç€ºã§ããŸããé©çšå¯èœãªãã¡ã³ã¯ã¿ãŒã䜿çšããå Žåããã¡ã³ã¯ã¿ãŒã®è€æ°ã®å€ã®éã«é¢æ°ãé©çšã§ããŸãããã©ãŒã ã§ãã®é¢æ°ã®ã¿ã€ããç¥èŠããã®ãããããã(a -> b -> c) -> (fa -> fb -> fc)
ã§ãããã®ããã«èªèããå ŽåliftA2
ãéåžžã®ãã€ããªé¢æ°ãåãã2ã€ã®é©çšå¯èœãªå€ã§æ©èœãã颿°ã«å€æãããšèšãããšãã§ããŸããè峿·±ãæŠå¿µããããŸãã2ã€ã®é©çšå¯èœãªå€ãååŸãããããã1ã€ã®é©çšå¯èœãªå€ã«çµåã§ããŸãããã®å€ã«ã¯ããªã¹ãå
ã®ããã2ã€ã®é©çšå¯èœãªå€ã®çµæãå«ãŸããŸããããšãã°ããšãJust 3
ããJust 4
ãŸãã2çªç®ã®ãã¡ã³ã¯ã¿ãŒã«ã¯ã·ã³ã°ã«ãã³ãªã¹ããå«ãŸããŠãããšããŸããããã¯éåžžã«ç°¡åã«å®çŸã§ããããã§ãã ghci> fmap (\x -> [x]) (Just 4) Just [4]
ã§ã¯ããšãæã£ãŠããJust 3
ãšããŸãããJust [4]
ãã©ããã£ãŠæã«å
¥ããã®Just [3,4]
ïŒç°¡åã§ãïŒ
ghci> liftA2 (:) (Just 3) (Just [4]) Just [3,4] ghci> (:) <$> Just 3 <*> Just [4] Just [3,4]
:
ããã¯ãèŠçŽ ãšãªã¹ããåãåãããã®èŠçŽ ãå
é ã«æã€æ°ãããªã¹ããè¿ã颿°ã§ããããšãæãåºããŠãã ãããããã§Just [3,4]
ããããšçµã¿åããJust 2
ãŠãããã¥ãŒã¹ã§ãJust [2,3,4]
ãŸããïŒã¯ããã§ããŸããä»»æã®æ°ã®é©çšå¯èœãªå€ã1ã€ã®é©çšå¯èœãªå€ã«çµåã§ããããã§ãããã®å€ã«ã¯ããããã®é©çšå¯èœãªå€ã®çµæã®ãªã¹ããå«ãŸããŠããŸããapplicativeå€ã®ãªã¹ããåãåãããã®çµæå€ãšããŠãªã¹ããå«ãapplicativeå€ãè¿ã颿°ãå®è£
ããŠã¿ãŸããããç§ãã¡ã¯åœŒå¥³ã«é»è©±ãsequenceA
ãŸãïŒ sequenceA :: (Applicative f) => [fa] -> f [a] sequenceA [] = pure [] sequenceA (x:xs) = (:) <$> x <*> sequenceA xs
ãããååž°ïŒãŸããã¿ã€ããèŠãŠã¿ãŸããããé©çšå¯èœãªå€ã®ãªã¹ãããªã¹ãä»ãã®é©çšå¯èœãªå€ã«å€æããŸãããã®åŸãããŒã¹ã±ãŒã¹ã®åºç€ãæ§ç¯ã§ããŸãã空ã®ãªã¹ããçµæã®ãªã¹ããå«ãé©çšå¯èœãªå€ã«å€æããå Žåã¯ã空ã®ãªã¹ããããã©ã«ãã®ã³ã³ããã¹ãã«é
眮ããã ãã§ããååž°ãç»å ŽããŸããããããšããŒã«ãæã€ãªã¹ããããå ŽåïŒx
ããã¯é©çšå¯èœãªå€ã§ããxs
ããããã§æ§æããããªã¹ãã§ããããšãæãåºããŠãã ããïŒãsequenceA
ããŒã«ãåŒã³åºããŸããããŒã«ã¯ããã®äžã«ãªã¹ããæã€é©çšå¯èœãªå€ãè¿ããŸãããã®åŸãåã«applicative valueå
ã«å«ãŸããå€x
ããã®applicative valueå
ã®ãªã¹ãã«å
è¡ããŸããããã ãã§ãïŒãããè¡ããšä»®å®ããŸãã sequenceA [Just 1, Just 2]
å®çŸ©ã«ãããããã¯æ¬¡ãšåçã§ãã (:) <$> Just 1 <*> sequenceA [Just 2]
ãããããã«ç Žããšã次ã®ããã«ãªããŸãã (:) <$> Just 1 <*> ((:) <$> Just 2 <*> sequenceA [])
åŒã³åºãsequenceA []
ãform Just []
ã§çµäºããããšãããã£ãŠããããããã®åŒã¯æ¬¡ã®ããã«ãªããŸãã (:) <$> Just 1 <*> ((:) <$> Just 2 <*> Just [])
ããã¯ããã«äŒŒãŠããŸãïŒ (:) <$> Just 1 <*> Just [2]
äœãçããJust [1,2]
ïŒãããå®è£
ããå¥ã®æ¹æ³sequenceA
ã¯ãç³ã¿èŸŒã¿ã䜿çšããããšã§ãããªã¹ããèŠçŽ ããšã«èª¿ã¹ãéäžã§çµæãèç©ããã»ãšãã©ãã¹ãŠã®é¢æ°ã¯ãç³ã¿èŸŒã¿ã䜿çšããŠå®è£
ã§ããããšãæãåºããŠãã ããã sequenceA :: (Applicative f) => [fa] -> f [a] sequenceA = foldr (liftA2 (:)) (pure [])
ããããªãŒå€ããå§ããŠããªã¹ããæåŸããé ã«èŠãŠãããŸãpure []
ãliftA2 (:)
ããããªãŒãšãªã¹ãã®æåŸã®èŠçŽ ã®éã§äœ¿çšããŸããããã«ãããã·ã³ã°ã«ãã³ãªã¹ããå«ãé©çšå¯èœãªå€ãåŸãããŸããæ¬¡ã«liftA2 (:)
ãçŸåšã®æåŸã®èŠçŽ ãšçŸåšã®ããããªãŒãªã©ã䜿çšããŠããã¹ãŠã®é©çšå¯èœãªå€ã®çµæã®ãªã¹ããå«ãããããªãŒã®ã¿ãååŸããŸãã颿°ãããã€ãã®é©çšå¯èœãªå€ã«é©çšããŠã¿ãŸãããã ghci> sequenceA [Just 3, Just 2, Just 1] Just [3,2,1] ghci> sequenceA [Just 3, Nothing, Just 1] Nothing ghci> sequenceA [(+3),(+2),(+1)] 3 [6,5,4] ghci> sequenceA [[1,2,3],[4,5,6]] [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] ghci> sequenceA [[1,2,3],[4,5,6],[3,4,4],[]] []
å€ã䜿çšããå ŽåMaybe
ãsequenceA
ããã¯å€äœæMaybe
èªäœã®äžã§ãªã¹ããšããŠãã¹ãŠã®çµæãå«ãã§ããŸããå€ã®ãããããçããNothing
å ŽåãçµæãNothing
ã§ããããã¯ãå€ã®ãªã¹ãããããå€Maybe
ãçãããªãå Žåã«ã®ã¿å€ã«é¢å¿ãããå Žåã«äŸ¿å©ã§ãNothing
ã颿°ã«é©çšããããšã颿°sequenceA
ã®ãªã¹ããåãåãããªã¹ããè¿ã颿°ãè¿ããŸãããã®äŸã§ã¯ããã©ã¡ãŒã¿ãŒãšããŠæ°å€ãåãåãããªã¹ãå
ã®å颿°ã«é©çšãã颿°ãäœæããçµæã®ãªã¹ããè¿ããŸãããsequenceA [(+3),(+2),(+1)] 3
åå ãšãªã(+3)
ãã©ã¡ãŒã¿3
ã(+2)
-ãã©ã¡ãŒã¿ã3
ããããŠ(+1)
ãªãã·ã§ã³ã§-3
ããããã®çµæããã¹ãŠãªã¹ããšããŠè¿ããŸããå®è¡ãããšã(+) <$> (+3) <*> (*2)
ãã©ã¡ãŒã¿ããšã颿°ãäœæãããããéä¿¡ããŸã(+3)
ãã(*2)
ãã®åŸãåå +
ãããäºã€ã®çµæããåãããã«ãsequenceA [(+3),(*2)]
ãã©ã¡ãŒã¿ãååŸããŠãªã¹ãå
ã®ãã¹ãŠã®é¢æ°ã«æž¡ã颿°ãäœæããããšã¯çã«ããªã£ãŠããŸãã+
颿°ã®çµæã§åŒã³åºã代ããã«ãçµã¿åããã:
䜿çšpure []
ããŠããããã®çµæããã®é¢æ°ã®çµæã§ãããªã¹ãã«èç©ããŸãã䜿çšããsequenceA
颿°ã®ãªã¹ããããããããã«ãã¹ãŠåãå
¥åãäžããçµæã®ãªã¹ãã衚瀺ãããå Žåã«äŸ¿å©ã§ããããšãã°ãæ°å€ãããããªã¹ãå
ã®ãã¹ãŠã®è¿°éšãæºãããã©ããçåã«æã£ãŠããŸãããããè¡ã1ã€ã®æ¹æ³ã次ã«ç€ºããŸãã ghci> map (\f -> f 7) [(>4),(<10),odd] [True,True,True] ghci> and $ map (\f -> f 7) [(>4),(<10),odd] True
ãããæãåºããŠãåã®å€ã®ãªã¹ããåãããããããã¹ãŠçããå Žåã«Bool
æ»ããŸããåãçµæãéæããå¥ã®æ¹æ³ã¯ã以äžã䜿çšããããšã§ãïŒTrue
True
sequenceA
ghci> sequenceA [(>4),(<10),odd] 7 [True,True,True] ghci> and $ sequenceA [(>4),(<10),odd] 7 True
sequenceA [ïŒ> 4ïŒãïŒ<10ïŒãodd]ã¯ãæ°å€ãåãããããã®ãã¹ãŠã®è¿°èªã«æž¡ã颿°ãäœæãã[(>4),(<10),odd]
ããŒã«å€ã®ãªã¹ããè¿ããŸããã¿ã€ãã®ãªã¹ããã¿ã€ã(Num a) => [a -> Bool]
ã®é¢æ°ã«å€ã(Num a) => a -> [Bool]
ãŸãããšãŠãã¯ãŒã«ã§ãããªã¹ãã¯åçš®ãªã®ã§ããªã¹ãå
ã®ãã¹ãŠã®é¢æ°ã¯ãã¡ããåãåã§ãªããã°ãªããŸãããã®ãããªãªã¹ããååŸããããšã¯ã§ããŸãã[ord, (+3)]
ããªããªãord
ãæåãåãåã£ãŠæ°åãè¿ãã®ã«å¯Ÿã(+3)
ãæ°åãåãåã£ãŠæ°åãè¿ãããã§ãããšãšãã«äœ¿çšãããš[]
ãsequenceA
ãªã¹ãã®ãªã¹ããåãããªã¹ãã®ãªã¹ããè¿ããŸããå®éããªã¹ãå
ã«ããèŠçŽ ã®ãã¹ãŠã®çµã¿åãããå«ããªã¹ããäœæããŸãã説æã®ããã«ãããã«äœ¿çšããåã®äŸã瀺ããŸãsequenceA
ãªã¹ããžã§ãã¬ãŒã¿ãŒã䜿çšããŠå®è¡ããŸãã ghci> sequenceA [[1,2,3],[4,5,6]] [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] ghci> [[x,y] | x <- [1,2,3], y <- [4,5,6]] [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] ghci> sequenceA [[1,2],[3,4]] [[1,3],[1,4],[2,3],[2,4]] ghci> [[x,y] | x <- [1,2], y <- [3,4]] [[1,3],[1,4],[2,3],[2,4]] ghci> sequenceA [[1,2],[3,4],[5,6]] [[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]] ghci> [[x,y,z] | x <- [1,2], y <- [3,4], z <- [5,6]] [[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]]
(+) <$> [1,2] <*> [4,5,6]
ããã¯ãéæ±ºå®è«çèšç®ã®çµæãè¿ãx + y
ãx
ããããããã®å€ããšãã[1,2]
ãããã³y
ããã®åå€ããšããŸã[4,5,6]
ããã¹ãŠã®å¯èœãªçµæãââå«ããªã¹ãã§ãããæç€ºããŸããåæ§ã«ããå®è¡ããsequenceA [[1,2],[3,4],[5,6]]
ãšãçµæã¯é決å®çèšç®ã«ãªã[x,y,z]
ãx
ããåå€ãååŸã[1,2]
ãã®y
åå€ãååŸããŸã[3,4]
ããã®é決å®çèšç®ã®çµæã衚ãããã«ããªã¹ãå
ã®åé
ç®ã1ã€ã®å¯èœãªãªã¹ãã§ãããªã¹ãã䜿çšããŸãããã®ãããçµæã¯ãªã¹ãã®ãªã¹ãã«ãªããŸããI / Oã¢ã¯ã·ã§ã³ã§äœ¿çšããå ŽåãsequenceA
ããã¯æ¬¡ãšåãã§ãsequence
ïŒ I / Oã¢ã¯ã·ã§ã³ã®ãªã¹ããåãåãããããã®åã¢ã¯ã·ã§ã³ãå®è¡ããI / Oã¢ã¯ã·ã§ã³ãè¿ããŸããçµæãšããŠããããã®I / Oã¢ã¯ã·ã§ã³ã®çµæã®ãªã¹ããå«ãŸããŸããããã¯ãå€ãvalueã«[IO a]
倿ããIO [a]
ããã«ãå®è¡æã«çµæã®ãªã¹ããè¿ãI / Oã¢ã¯ã·ã§ã³ãäœæããããã«ãããããã¹ãŠã®I / Oã¢ã¯ã·ã§ã³ãé çªã«é
眮ããŠãå®è¡çµæãå¿
èŠãªãšãã«1ã€ãã€å®è¡ã§ããããã«ããå¿
èŠãããããã§ããå®è¡ããªããšãI / Oã¢ã¯ã·ã§ã³ã®çµæãååŸã§ããŸããã3ã€ã®I / Oã¢ã¯ã·ã§ã³getLine
ãã·ãŒã±ã³ã¹ã«å
¥ããŸãããïŒ ghci> sequenceA [getLine, getLine, getLine] heyh ho woo ["heyh","ho","woo"]
çµè«ãšããŠãé©çšãã¡ã³ã¯ã¿ãŒã¯è峿·±ãã ãã§ãªããæçšã§ããããŸããI / Oèšç®ãéæ±ºå®çèšç®ã倱æããå¯èœæ§ã®ããèšç®ãªã©ãããŸããŸãªèšç®ãapplicativeã¹ã¿ã€ã«ã䜿çšããŠçµã¿åãããããšãã§ããŸãããã ã䜿çš<$>
ããŠ<*>
ãç§ãã¡ã¯äžæ§ã«applicativesã®ä»»æã®æ°ã§åäœãããããã®ããããã®ã»ãã³ãã£ã¯ã¹ã掻çšããããã«éåžžã®æ©èœã䜿çšããããšãã§ããŸãã
å®å
šãªåŠçïŒæ§é ãšã³ã³ãã³ãïŒãå¿
èŠãšããæ¬ã®åã®ç« ã®ç¿»èš³ïŒ- ã¯ããã«
- éå§ãã
- ã¿ã€ããšã¿ã€ãã¯ã©ã¹
- 颿°ã®æ§æ
- ååž°
- é«é颿°
- ã¢ãžã¥ãŒã«
- ç¬èªã®åãšåã¯ã©ã¹ãäœæãã
- å
¥åºå
- æ©èœçãªåé¡è§£æ±º
åºçã®æ¬¡ã®è¡ã¯ã¢ãã€ãã®ç« ã§ãããããŸã§ã®ãšãããå
å®¹ãæ¹åãã建èšçãªã³ã¡ã³ããæåŸ
ããŠããŸãããããããé¡ãããŸãïŒ