我想提取一个数据库字段(Text)并将其作为参数传递给Handler中的另一个函数。但是,我遇到了类型错误。完全成熟的例子可能会让人觉得有点做作,但应该说明我遇到的问题。
Person
name Text
Car
personId PersonId
name Text
type Text
我想获得一个Car实体,然后找到相应的Person。得到他的名字,然后将其作为参数传递。类似的东西:
data MyD = MyD { input1 :: Int}
entryForm :: Text -> Form MyD -- Update: Removed the incorrect extra parameter
entryForm n1 = renderDivs $ MyD
<$> areq intField n1 Nothing
我的获取处理程序如下:
getInputR :: CarId -> Handler Html
getInputR carId = do
car <- runDB $ get404 carId
pid <- carPersonId car
name <- getPName pid
(widget, enctype) <- generateFormPost $ entryForm name
defaultLayout $ do
$(widgetFile "my_template")
where
getPName pid = do
person <- runDB $ get404 pid
personName person
我收到错误说:
Couldn't match expected type `HandlerT App IO t0'
with actual type `KeyBackend
persistent-1.2.1:Database.Persist.Sql.Types.SqlBackend Person'
In the return type of a call of `carPersonId'
In a stmt of a 'do' block: pid <- carPersonId car
我做错了什么?
谢谢!
答案 0 :(得分:2)
尝试更改
pid <- carPersonId car
name <- getPName pid
到
name <- getPName $ carPersonId car
从runDB
调用返回的值不在处理程序monad中,因此您无需使用箭头语法来访问它。
对于第二个错误,问题类似:getPName
函数的返回类型位于Handler monad中,因为它使用runDB
,因此您需要使用return
来设置值进入monad:
getPName pid = do
person <- runDB $ get404 pid
return $ personName person