Yesod 书籍示例聊天和脚手架
Yesod book example chat and scaffolding
我正在尝试从脚手架站点中的 Yesod book 制作聊天示例。
我想我已经纠正了几乎所有我必须纠正的问题,但所有这些对我来说都是全新的(这是我的第一个 "real" Haskell 项目)并且我不是很自信在我所有的修改中;此外,我真的卡在了第 7 点。如有必要,您能否评论以下所有要点,并帮助我完成第 7 点。(在 bold some questions/remarks 中)?
- Copy/paste 我网站根目录中的 Chat.hs 和 Chat/Data.hs,
- 将
import Chat as Import
和 import Chat.Data as Import
添加到 Import.NoFoundation,
- 在 Data.hs 中添加 IO、Bool、return、Maybe(Nothing)、($) 的导入,因为扩展名 NoImplicitPrelude 在 上看起来很笨拙...我们是否必须在每个新文件中导入所有标准运算符?
- 在Fundation.hs中,在
App
记录中添加getChat
(在appHttpManager
和appLogger
之后)
在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
这看起来很长而且嵌套...我们可以做得更好吗?
- 在
Fundation.hs
中,在defaultLayout
定义的pc <- widgetToPageContent $ do
行后添加chatWidget ChatR
。
现在,我有以下警告:
Application.hs:60:36: Warning:
Fields of ‘App’ not initialised: getChat
In the expression: App {..}
我想我必须在 makeFundation
定义中的 appLogger <- newStdoutLoggerSet defaultBufSize >>= makeYesodLogger
和 appStatic <- ...
之后写类似 getChat <- newChan >>=Chat
的内容,但类型不匹配。 我完全迷路了,我真的不明白这个函数 makeFundation
是如何工作的。
你实际上几乎完成了整个过程。我认为您只需要将行更改为:
getChat <- fmap Chat newChan
或者,如果您还不熟悉 fmap
函数,您可以使用 do 符号并得到:
chan <- newChan
let getChat = Chat chan
我正在尝试从脚手架站点中的 Yesod book 制作聊天示例。
我想我已经纠正了几乎所有我必须纠正的问题,但所有这些对我来说都是全新的(这是我的第一个 "real" Haskell 项目)并且我不是很自信在我所有的修改中;此外,我真的卡在了第 7 点。如有必要,您能否评论以下所有要点,并帮助我完成第 7 点。(在 bold some questions/remarks 中)?
- Copy/paste 我网站根目录中的 Chat.hs 和 Chat/Data.hs,
- 将
import Chat as Import
和import Chat.Data as Import
添加到 Import.NoFoundation, - 在 Data.hs 中添加 IO、Bool、return、Maybe(Nothing)、($) 的导入,因为扩展名 NoImplicitPrelude 在 上看起来很笨拙...我们是否必须在每个新文件中导入所有标准运算符?
- 在Fundation.hs中,在
App
记录中添加getChat
(在appHttpManager
和appLogger
之后) 在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
这看起来很长而且嵌套...我们可以做得更好吗?
- 在
Fundation.hs
中,在defaultLayout
定义的pc <- widgetToPageContent $ do
行后添加chatWidget ChatR
。 现在,我有以下警告:
Application.hs:60:36: Warning: Fields of ‘App’ not initialised: getChat In the expression: App {..}
我想我必须在
makeFundation
定义中的appLogger <- newStdoutLoggerSet defaultBufSize >>= makeYesodLogger
和appStatic <- ...
之后写类似getChat <- newChan >>=Chat
的内容,但类型不匹配。 我完全迷路了,我真的不明白这个函数makeFundation
是如何工作的。
你实际上几乎完成了整个过程。我认为您只需要将行更改为:
getChat <- fmap Chat newChan
或者,如果您还不熟悉 fmap
函数,您可以使用 do 符号并得到:
chan <- newChan
let getChat = Chat chan