, name :: Text , beers :: m [Beer] } deriving (Generic, GQLType) data Beer = Beer { id :: BeerId , name :: Text , ibu :: Maybe Int } deriving (Generic, GQLType) ストア ビール N N ストアのビール一覧 RDBでの想定
-> m (Store m) , stores :: StoresArgs -> m [Store m] , beer :: BeerArgs -> m Beer , bestBeer :: m Beer } deriving (Generic, GQLType) data StoresArgs = StoresArgs { name :: Maybe Text } deriving (Generic, GQLType) data Style = Lager | Ale | Stout deriving (Generic, GQLType) クエリの実行環境 Resolver o event m value Resolver: フィールドの要求に応じて データ取得や計算を行う → enum
StoreArgs { id } = lift $ renderStore <$> getStore id renderStore :: E.Store -> Store (Resolver QUERY e AppM) renderStore x = Store { id = x ^. #id , name = x ^. #name & pack , beers = beersR (x ^. #id) } データ取得(DB問い合わせ) 返却する型に詰める 別のResolverを指定 resolverA resolverB resolverC query { A { B } }
id = do debug ("getStore", id) head <$> queryM selectStore id getBeers :: E.StoreId -> AppM [E.Beer] getBeers id = do debug ("getBeers", id) queryM selectBeersByStoreId id StoreId
2017). Haskell in the datacentre! https://simonmar.github.io/slides/Haskell%20in%20the%20datacentre.pdf numCommonFriends a b = do fa <- friendsOf a fb <- friendsOf b return (length (intersect fa fb)) friendsOf a friendsOf b intersect fa fb friendsOf a friendsOf b intersect fa fb 引用元 [1]
fb <- friendsOf b return (length (intersect fa fb)) friendsOf a >>= (\x1-> friendsOf b >>= (\x2 -> return length (intersect fa fb)) )) numCommonFriends a b = (length . intersect) <$> friendsOf a <*> friendsOf b
<- A x2 <- B x3 <- C x1 x4 <- D x2 return (x1,x2,x3,x4) join ((\x1 x2 -> (\x3 x4 - > (x1,x2,x3,x4)) <$> C x1 <*> D x2)) <$> A <*> B) B (x1, x2, x3, x4) A D x2 C x1 暗黙の並列化