"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
1BUI4FHNFOU1BSBNFUFS
ΤϯυϙΠϯτͷߏΛͭͳ͙
ΤϯυϙΠϯτಉ࢜Λͭͳ͙
୯७ͳ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#PEZ3FTQPOTFͷܕఆٛ
ΤϯυϙΠϯτΛఆٛ
͍͔ͭ͘ͷܕΫϥεͷΠϯελϯεʹ͓ͯ͘͠
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 IFUFSPDFQIBMVTTIBLFTQFBSFͳͲܕ҆શͳςϯ
ϓϨʔτ͕͓͢͢Ί &NBJMͳͲʹར༻
ϛυϧΣΞɾ֎෦αʔϏε
ؔ࿈
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*։ൃͰ͖Δ