Yesod 书籍示例聊天和脚手架

Yesod book example chat and scaffolding

我正在尝试从脚手架站点中的 Yesod book 制作聊天示例。

我想我已经纠正了几乎所有我必须纠正的问题,但所有这些对我来说都是全新的(这是我的第一个 "real" Haskell 项目)并且我不是很自信在我所有的修改中;此外,我真的卡在了第 7 点。如有必要,您能否评论以下所有要点,并帮助我完成第 7 点。(在 bold some questions/remarks 中)?

  1. Copy/paste 我网站根目录中的 Chat.hs 和 Chat/Data.hs,
  2. import Chat as Importimport Chat.Data as Import 添加到 Import.NoFoundation,
  3. 在 Data.hs 中添加 IO、Bool、return、Maybe(Nothing)、($) 的导入,因为扩展名 NoImplicitPrelude 在 上看起来很笨拙...我们是否必须在每个新文件中导入所有标准运算符?
  4. 在Fundation.hs中,在App记录中添加getChat(在appHttpManagerappLogger之后)
  5. 在Fundation.hs中,为App添加YesodChat实例:我不得不修改Just uid案例中的getUserName(在聊天的原始示例中,它只是 Just uid -> return uid):

            Just uid -> do
            muser <- runDB  $ get uid
            case muser of
                Nothing -> error "uid not in the DB"
                Just user ->  return $ userIdent user
    

    这看起来很长而且嵌套...我们可以做得更好吗?

  6. Fundation.hs中,在defaultLayout定义的pc <- widgetToPageContent $ do行后添加chatWidget ChatR
  7. 现在,我有以下警告:

    Application.hs:60:36: Warning:
    
    Fields of ‘App’ not initialised: getChat
    In the expression: App {..}
    

    我想我必须在 makeFundation 定义中的 appLogger <- newStdoutLoggerSet defaultBufSize >>= makeYesodLoggerappStatic <- ... 之后写类似 getChat <- newChan >>=Chat 的内容,但类型不匹配。 我完全迷路了,我真的不明白这个函数 makeFundation 是如何工作的。

你实际上几乎完成了整个过程。我认为您只需要将行更改为:

getChat <- fmap Chat newChan

或者,如果您还不熟悉 fmap 函数,您可以使用 do 符号并得到:

chan <- newChan
let getChat = Chat chan