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