如何解决创建新的处理程序后,清空并阻止yesod
我尝试在yesod / haskell中使用名为state的处理程序创建新路由,但出现错误empty 'do' block
复制步骤如下:
- 创建新的yesod应用程序:
stack new haskellYesod yesodweb/simple
-
yesod add-handler
用于添加带有参数的新处理程序:- 路线名称:州
- 路由模式:/ state /
- 方法:GET
- 在
src/Handler/State.hs
中添加以下代码
module Handler.State where
import Import
getStateR :: Handler Html
getStateR = do
defaultLayout $ do
$(widgetFile "bla")
- 创建简单的HTML网站
templates/bla.hamlet
:
<h1> BLA!
- 使用
stack exec yesod devel
启动服务器
那之后我得到了错误:
src/Handler/State.hs:7:21: error: Empty 'do' block
|
7 | defaultLayout $ do
解决方法
正在发生的事情是,如果没有扩展名TemplateHaskell
,则语法$(...)
不会被识别为预期的。而是将其解析为一个do块,然后解析为运算符$
,然后解析为表达式(...)
,就像您编写的一样:
getStateR = do
defaultLayout $ (do $ widgetFile "bla")
^^ empty do-block
您会在独立程序中看到相同的问题:
main = do
$(thiswontwork)
,也被解析为main = do $ thiswontwork
,并生成一条Empty 'do' block
消息。
在{-# LANGUAGE TemplateHaskell #-}
文件顶部添加State.hs
足以解决问题。
问题是缺少扩展名。添加以下内容后,错误消失了:
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。