【问题标题】:Yesod - Error "couldn't match expected type" when extracting data from databaseYesod - 从数据库中提取数据时出现“无法匹配预期类型”错误
【发布时间】:2017-01-09 20:17:37
【问题描述】:

拥有以下数据库模型,我正在尝试获取事件的城市名称(来自城市的某个字段 - 相关实体):

City json
    name Text
    countryId CountryId
    UniqueCity name
    deriving Eq
    deriving Show
Event
    title Text
    description Text
    date UTCTime
    cityId CityId

extractCityName :: EventId -> Text
extractCityName eventId = do
event <- runDB $ get404 eventId
    city <- runDB $ get404 (eventCityId event)
    x <- cityName city
    return cityName

即使尚未调用该函数(在编译时),我也会遇到此错误:

Couldn't match expected type `HandlerT site0 IO t0' with actual type `Text'
    In a stmt of a 'do' block: x <- cityName city
    In the expression:
      do { event <- runDB $ get404 eventId;
          city <- runDB $ get404 (eventCityId event);
          x <- cityName city;
          return cityName }

你能帮我弄清楚我的代码有什么问题吗?

【问题讨论】:

    标签: haskell yesod


    【解决方案1】:

    那是因为runDB 的类型签名是YesodDB site a -&gt; HandlerT site IO a。除非您想在 yesod 处理程序中运行与数据库相关的操作,否则您不需要runDB。提取城市名称的代码如下:

    extractCityName :: EventId -> ReaderT SqlBackend IO (Maybe Text)
    extractCityName eventId = do
      event <- selectFirst [EventId ==. eventId] [LimitTo 1]
      case event of
        Nothing -> return Nothing
        Just event' -> do
                   city <- getJust (eventCityId $ entityVal event')
                   return $ Just $ cityName city
    

    现在您可以在实际需要时在 Yesod 处理程序中使用上述函数。您可以在结果中进行模式匹配,如果结果为Nothing,则发送404 页面。

    【讨论】:

    • 感谢您的及时答复。现在函数编译了,但我仍然有一个问题。正如您所说,该函数只能在 Yesod 处理程序中使用。你知道可以做些什么来让它在小村庄也能发挥作用吗?我已经发布了另一个带有详细问题和代码的问题:stackoverflow.com/questions/41548361/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多