Haskell GraphQLAPI处理程序上的映射
我一直在尝试使用,它使用了一些Haskell GraphQLAPI处理程序上的映射,haskell,graphql,haskell-graphql,Haskell,Graphql,Haskell Graphql,我一直在尝试使用,它使用了一些servant风格的类型技巧来表示类型级别的GraphQLAPI。它提供了类型族,用于提供GraphQLAPI的实际实现。我为测试目的创建了一个简单的API: type Query = Object "Query" '[] '[ Argument "id" Text :> Field "test" (Maybe Foo) ] type Foo = Object "Foo" '[] '[ Field "name" Text ] 我还有一个代表Foo资
servant
风格的类型技巧来表示类型级别的GraphQLAPI。它提供了类型族,用于提供GraphQLAPI的实际实现。我为测试目的创建了一个简单的API:
type Query = Object "Query" '[]
'[ Argument "id" Text :> Field "test" (Maybe Foo) ]
type Foo = Object "Foo" '[]
'[ Field "name" Text ]
我还有一个代表Foo
资源的Haskell类型,以及一个从数据库检索它的函数:
data ServerFoo = ServerFoo
{ name :: Text
} deriving (Eq, Show)
lookupFoo :: Text -> IO (Maybe ServerFoo)
现在,我想为查询
实现一个处理程序
。首先,我为Foo
实现了一个处理程序
:
viewFoo :: ServerFoo -> Handler IO Foo
viewFoo ServerFoo { name } = pure $ pure name
然后我开始实现根处理程序,但我意识到当我最终使用可能是ServerFoo
时,我不确定如何使用我的viewFoo
函数。我试过这个:
handler :: Handler IO Query
handler = pure $ \fooId -> do
foo <- lookupFoo fooId
sequence $ fmap viewFoo foo
这对我来说似乎有点奇怪,因为我读过的示例似乎暗示Handler
s是为组合而设计的。事实上,它们似乎是这样的,因为做一些调整来删除Maybe
会导致这种类型检查:
type Query = Object "Query" '[]
'[ Argument "id" Text :> Field "test" Foo ]
handler :: Handler IO Query
handler = pure $ \fooId -> do
Just foo <- lookupFoo fooId
viewFoo foo
type Query=Object“Query”[]
“[参数“id”文本:>字段“test”Foo]
handler::handler IO查询
handler=pure$\fooId->do
Just foo您应该查看处理程序IO X的实际定义,以查看哪些类型不匹配。viewFoo
的类型为。->IO(IO Foo)
,所以是序列。fmap viewFoo
是IO(可能是(IO…)
而处理程序::IO(IO…)
。GHCs坚持不扩展类型族在这里是有害的,所以只需将它们从类型注释中删除即可。另外,我不确定后一个程序是否相关-您的“调整”本质上只是一个完全不同的术语(因为两个术语开头都很小),因此它与前一个程序无关。@user2407038是,我确实了解到了这一点——我实际上花了相当多的时间检查了处理程序的源定义——但即使这样做了,尽管这解释了为什么我尝试的方法不起作用,我仍然不确定如何真正解决我的问题。你应该看看Handler IO X的实际定义,看看哪些类型不匹配。viewFoo
的类型为。->IO(IO Foo)
,所以是序列。fmap viewFoo
是IO(可能是(IO…)
而处理程序::IO(IO…)
。GHCs坚持不扩展类型族在这里是有害的,所以只需将它们从类型注释中删除即可。另外,我不确定后一个程序是否相关-您的“调整”本质上只是一个完全不同的术语(因为两个术语开头都很小),因此它与前一个程序无关。@user2407038是,我确实了解到了这一点——我实际上花了相当多的时间检查了处理程序的源定义
——但即使这样做了,尽管它解释了我尝试的方法不起作用的原因,但我仍然不确定如何真正解决我的问题。
type Query = Object "Query" '[]
'[ Argument "id" Text :> Field "test" Foo ]
handler :: Handler IO Query
handler = pure $ \fooId -> do
Just foo <- lookupFoo fooId
viewFoo foo