Slide 1

Slide 1 text

)BTLFMM4FSWBOUͰߦ͏ ҆શ͔ͭߴ଎ͳ"1*։ൃ גࣜձࣾ-&.0$50தౢେ࢚ )BTLFMM%BZ )BTLFMMͪΐͬͱڵຯ͋Δਓ

Slide 2

Slide 2 text

ΞδΣϯμ )BTLFMMͷ༻్ ٕज़ελοΫ ࣮ࡍͷ࢖͍ํɾ։ൃελΠϧ ར༻ϥΠϒϥϦͷ֓ཁ

Slide 3

Slide 3 text

໨ඪ w )BTLFMMΛ ۀ຿Ͱ ࢖ͬͯΈΑ͏ʂ w ࢖͏͜ͱΛݕ౼͠Α͏ʂ ͱ͍͏ؾ࣋ͪʹͳ͍͚ͬͯͨͩΔΑ͏ؤுΓ·͢

Slide 4

Slide 4 text

)BTLFMMͷ༻్

Slide 5

Slide 5 text

)BTLFMMͷ༻్ w #BDLFOE 8FC"1*#BUDI ͷ։ൃ w Ұൠతͳ8ϞόΠϧΞϓϦ w ௚ۙ w ՝ۚͷ͋Δ4/4ʢ#&ਓ݄ఔ౓ʣ

Slide 6

Slide 6 text

ٕज़ελοΫ

Slide 7

Slide 7 text

ར༻ٕज़ -BOH)BTLFMM 8"'4FSWBOU 2VFSZ#VJMEFS3.)BTLFMM3FMBUJPOBM3FDPSE

Slide 8

Slide 8 text

)BTLFMMͷ঺հ w ७ਮؔ਺ܕϓϩάϥϛϯάݴޠ w ෭࡞༻ͷ෼཭ w ੩తܕ෇͚ܕਪ࿦ w ஗ԆධՁ

Slide 9

Slide 9 text

4FSWBOUͷ঺հ w ബ͍8FC"QQMJDBUJPO'SBNFXPSL w Ұൠతͳ8"' w ػೳ͸γϯϓϧ w OPEFFYQSFTT SVCZTJOBUSB

Slide 10

Slide 10 text

4FSWBOUͷಛ௃ w ܕϨϕϧϓϩάϥϛϯά w "1*Λ)BTLFMMͷܕͱͯ͠ఆٛ w ܕ҆શͳ8FC"QQMJDBUJPOͷ։ൃ w ܕ͔Β෭࢈෺ͷੜ੒

Slide 11

Slide 11 text

)BTLFMM3FMBUJPOBM3FDPSE w ந৅తͰܕ҆શͰ߹੒ՄೳͳΫΤϦδΣωϨʔλʔ w %#ͷεΩʔϚ͔ΒɺίϯύΠϧ࣌ʹܕΛੜ੒ w ͜ͷܕΛ࢖͍ΫΤϦΛهड़ɺίϯύΠϧ͕௨Ε͹ਖ਼͍͠ 42- w ໰͍߹Θͤ݁Ռ΋ܕʹϚοϐϯά

Slide 12

Slide 12 text

࣮ࡍͷ࢖͍ํɾ։ൃελΠϧ

Slide 13

Slide 13 text

4FSWBOU "1*ͷܕ શମ͕ܕͰܨ͕ͬͨঢ়ଶ 3FRVFTU %# )33 )BOEMFS 4FSWJDF 7JFX 3FTQPOTF &OUJUZ )551 2VFSZ ܕͷ֎ͷੈք ܕͷ֎ͷੈք Y ઃܭ্ͷ੍໿ υΩϡϝϯτ౳ͷੜ੒

Slide 14

Slide 14 text

࣮ྫ "1*ͷઃܭɾܕఆٛ 4XBHHFS .PDL4FSWFS౳ͷੜ੒ '8ͷ֦ு ࣮૷ɺςετ

Slide 15

Slide 15 text

"1*ΛܕͰఆٛ w ϢʔβʔҰཡͷऔಘ DVSM9(&5VTFST QBHF w Ϣʔβʔ৘ใͷߋ৽ DVSM91"5$)VTFSTE\OBNFGPP^ type API = "users" :> QueryParam "page" Int :> Get '[JSON] GetUsersResponse :<|> "users" :> Capture "id" Int :> ReqBody '[JSON] PostUsersBody :> Patch '[JSON] Int type MyMap = Map Int String

Slide 16

Slide 16 text

"1*ΛܕͰఆٛ w ϢʔβʔҰཡͷऔಘ DVSM9(&5VTFST QBHF w Ϣʔβʔ৘ใͷߋ৽ DVSM91"5$)VTFSTE\OBNFGPP^ type API = "users" :> QueryParam "page" Int :> Get '[JSON] GetUsersResponse :<|> "users" :> Capture "id" Int :> ReqBody '[JSON] PostUsersBody :> Patch '[JSON] Int type MyMap = Map Int String 1BUI4FHNFOU΍1BSBNFUFS౳ ΤϯυϙΠϯτͷߏ੒Λͭͳ͙ ΤϯυϙΠϯτಉ࢜Λͭͳ͙ ୯७ͳUZQFBMJBT

Slide 17

Slide 17 text

ରԠ͢Δ࣮૷ getUsers :: Maybe Int -> Handler GetUsersResponse getUsers mpage = undefined patchUser :: Int -> PatchUsersBody -> Handler Int patchUser userId body = undefined api :: Server API api = getUsers :<|> putUsers aఆٛͱ࣮૷ͷҰக͕อূ͞Ε͍ͯΔ

Slide 18

Slide 18 text

)BOEMFSʹ͍ͭͯ w ෭࡞༻ͷ͋Δܭࢉ w #BE3FRVFTU౳ͷྫ֎ΛUISPX Handler runHandler' :: ExceptT ServantErr IO a f :: Handler String f = do rs <- liftIO $ httpRequest "who am i" when (rs == YouAreTeapot) $ throwError err418 return $ “my name is " ++ rs

Slide 19

Slide 19 text

࣮ࡍʹ"1*Λఆٛ͢Δ data HogeRequest = HogeRequest { _id :: Int64 , _name :: String } type API = "hoge" :> ReqBody '[JSON] HogeRequest … api = undefined 3FRVFTU#PEZ΍3FTQPOTFͷܕ΋ఆٛ ΤϯυϙΠϯτΛఆٛ ͍͔ͭ͘ͷܕΫϥεͷΠϯελϯεʹ͓ͯ͘͠ UP+40/ GSPN+40/ %FGBVMU 5P4DIFNB "SCJUSBSZ FUD

Slide 20

Slide 20 text

ܕΫϥε w 5P+40/'SPN+40/+40/ʹม׵Մೳ w %FGBVMUσϑΥϧτͷ஋Λੜ੒Մೳ w 5P4DIFNB4XBHHFSυΩϡϝϯτʹม׵Մೳ w "SCJUSBSZϥϯμϜͳ஋Λੜ੒Մೳ w -FOTHFUUFSTFUUFS

Slide 21

Slide 21 text

࣮ྫ "1*ͷઃܭɾܕఆٛ 4XBHHFS .PDL4FSWFS౳ͷੜ੒ '8ͷ֦ு ࣮૷ɺςετ

Slide 22

Slide 22 text

TXBHHFS NPDL౳ͷੜ੒ w "1*ఆ͔ٛΒੜ੒ w 4XBHHFS w TFSWBOUTXBHFS w ࣮૷ͱυΩϡϝϯτ͕ͣΕͳ͍ݴޠͷྗΛ࢖͑Δ w ϞοΫαʔόʔ w TFSWBOUNPDL w "SCJUSBSZ 2VJDL$IFDL

Slide 23

Slide 23 text

࣮ྫ "1*ͷઃܭɾܕఆٛ 4XBHHFS .PDL4FSWFS౳ͷੜ੒ '8ͷ֦ு ࣮૷ɺςετ

Slide 24

Slide 24 text

)BOEMFSͷ֦ு w )BOEMFSʹඞཁͳϞφυΛ߹੒͢Δ newtype AppM a = AppM { runAppM :: ReaderT Context Handler a } deriving (...) 3FBEFS άϩʔόϧʹࢀর͢Δ஋Λѻ͏ ઃఆ஋ɺ$POOFDUJPO1PPM 5SBOTBDUJPO؅ཧ ౳ 3FBEFSΛ߹੒

Slide 25

Slide 25 text

ܕͰઃܭ্ͷ੍໿Λߦ͏ w DMBTT .POBE4FSWJDFN w ෭࡞༻࣮ߦՄೳ %#΁ͷΞΫηεՄೳ )551తͳྫ֎ ౤͛ͨΓ͸Ͱ͖ͳ͍ w DMBTT ʜ .POBE7JFXN w ઃఆ஋ͷࢀর͸Մೳ ෭࡞༻ى͜͞ͳ͍

Slide 26

Slide 26 text

ܕͰઃܭ্ͷ੍໿Λߦ͏ queryM :: MonadService m => a -> m b … renderUser :: MonadView m => User -> m UserView renderUser x = do imgs <- queryM UserImages x … ίϯύΠϧΤϥʔ

Slide 27

Slide 27 text

࣮ྫ "1*ͷઃܭɾܕఆٛ 4XBHHFS .PDL4FSWFS౳ͷੜ੒ '8ͷ֦ு ࣮૷ɺςετ

Slide 28

Slide 28 text

4FSWJDFͷ࣮૷ w ϩδοΫॻ͘

Slide 29

Slide 29 text

7JFXͷ࣮૷ w "1*ͳͷͰ+40/ʹͰ͖Δσʔλܕʹ஋ΛೖΕΔ࡞ۀ w ҼΈʹɺ)5.-౳Λѻ͏৔߹ɺςϯϓϨʔτΤϯδϯ͕ ͋Δ w IFUFSPDFQIBMVT΍TIBLFTQFBSFͳͲܕ҆શͳςϯ ϓϨʔτ͕͓͢͢Ί &NBJMͳͲʹར༻

Slide 30

Slide 30 text

3&1-ͰԥΔ > runAppM’ $ postMessagesR $ def & text .~ “hello” Right (Message {_id = 123, _userName = “hoge”, image=… postMessagesR :: PostMessageBody -> AppM Message ࣍ͷ)BOEMFSʢΤϯυϙΠϯτʣΛςετ͍ͨ͠ HIDJͰ؆୯ʹ࣮ߦ

Slide 31

Slide 31 text

4FSWBOU "1*ͷܕ શମ͕ܕͰܨ͕ͬͨঢ়ଶ 3FRVFTU %# )33 )BOEMFS 4FSWJDF 7JFX 3FTQPOTF &OUJUZ )551 2VFSZ ܕͷ֎ͷੈք ܕͷ֎ͷੈք Y ઃܭ্ͷ੍໿ υΩϡϝϯτ౳ͷੜ੒

Slide 32

Slide 32 text

શମ͕ܕͰܨ͕ͬͨঢ়ଶ w ୯७ͳόάΛ๷͙ɻ w ࣗ໌ͳςετΛॻ͘ඞཁ͕ͳ͍ɻ w ϩδοΫʹूத w ྫ͸3%#)33͕ͩɺ)BTLFMMͰ͸Ϩϕϧͷࠩ͸͋ΕͲɺ ຆͲͷϥΠϒϥϦ͕ܕ҆શͰ͋Δ܏޲͕͋Δɻ

Slide 33

Slide 33 text

ར༻ϥΠϒϥϦͷ ֓ཁ

Slide 34

Slide 34 text

ଞɺར༻͍ͯ͠ΔϥΠϒϥϦ TFSWBOUTFSWFS TFSWBOUBVUITFSWFS TFSWBOUNPDL TFSWBOUNVMUJQBSU TFSWBOUTXBHHFS IUUQUZQFT JNBHFUZQF XBJ XBJDPST XBSQ 8FC BFTPO EBUBEFGBVMUDMBTT MFOT VVJE ZBNM UZQFMFWFMTFUT VOPSEFSFEDPOUBJOFST DBTTBWB WFDUPS QEGUPPMCPYEPDVNFOU VOJDPEFTIPX NJNFNBJM DPOUBJOFST σʔλ KPTF ҉߸ )%#$QPTUHSFTRM )%#$TFTTJPO SFMBUJPOBMRVFSZ SFTPVSDFQPPM TRMXPSET 3%# HPHPM HPHPMDPSF pSFCBTFBENJO BNB[POLB BNB[POLBDPSF BNB[POLBT BNB[POLBTFT IUUQDMJFOU IUUQDPOEVJU DPOOFDUJPO TTJHOFS CMPPEIPVOE ଞΫϥΠΞϯτ IFUFSPDFQIBMVT CMB[FNBSLVQ ςϯϓϨʔτ LBUJQ NPOBEMPHHFS ϩΨʔ

Slide 35

Slide 35 text

ϛυϧ΢ΣΞɾ֎෦αʔϏε ؔ࿈ w 3%#.4)%#$ )33 w &MBTUJDTFBSDICMPPEIPVOE w "84"1*BNB[POLB w (PPHMF"1*HPHPM w 'JSFCBTF͹Β͹Βͱଘࡏ͢Δ͕ࠓ͸࢖Θͣ

Slide 36

Slide 36 text

ϥΠϒϥϦ଍Γͳ͍ɾͳΜ͔ ໰୊͋ͬͨΈ͍ͨͳέʔε w ৽͍͠΋ͷʹؔ͢ΔରԠ w pSFCBTFGDNBENJOSFBMUJNFEC w CMPPEIPVOEͱ&MBTUJDTFBSDIͷWFSTJPO w ϚϧνόΠτରԠ w NJNFNBJMͱ೔ຊޠ w ۩ମ౓͕ߴ͍ɾมͳ༻్ w ࿨ྐྵ w όάͬͨDTW

Slide 37

Slide 37 text

·ͱΊ

Slide 38

Slide 38 text

·ͱΊ w ҆શ w ੩తܕ෇͚ɺ෭࡞༻ͷ෼཭ʹΑΓόά๷͙ w %#ͳͲͱͷ݁߹Ͱͷόά΋๷͙ w υΩϡϝϯτͱ࣮૷ͷᴥᴪΛى͜͞ͳ͍ w ߴ଎ w ந৅౓ͷߴ͍ɺσʔλɾϩδοΫΛදݱɾ࣮૷ w ࣗ໌ͳςετΛॻ͔ͳͯ͘ྑ͍ঢ়ଶʹ͢Δ w ܕʹΑΔ੍໿ʹΑΓɺίʔυϨϏϡʔͷίετΛԼ͛Δ w 3&1-ͳͲ΋࢖ͬͨॊೈͳ։ൃελΠϧ

Slide 39

Slide 39 text

·ͱΊ w ଟ͘ͷϝϦοτ͕༗Δ w ҰൠతͳϥΠϒϥϦ͸े෼ʹἧ͍ͬͯΔ w )BTLFMMͰ8FC"1*։ൃͰ͖Δ

Slide 40

Slide 40 text

࣭ٙԠ౴ )BTLFMM࢖͓͏ UXJUUFS!OBLBKJ@EBZP