创建新处理程序后清空 do 块 yesod
Empty do block yesod after creating new handler
我尝试在 yesod / haskell 中使用名为 state 的处理程序创建新路由,但出现错误 empty 'do' block
复现步骤如下:
- 创建新的 yesod 应用程序:
stack new haskellYesod yesodweb/simple
yesod add-handler
用于添加带有参数的新处理程序:
- 路线名称:州
- 路由模式:/state/
- 方法:获取
- 在
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
问题是缺少扩展名。添加以下内容后,错误消失:
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
发生的事情是,如果没有 TemplateHaskell
扩展名,语法 $(...)
将无法按预期识别。相反,它被解析为 do-block,后跟运算符 $
,然后是表达式 (...)
,就像您写的一样:
getStateR = do
defaultLayout $ (do $ widgetFile "bla")
^^ empty do-block
您会在独立程序中看到同样的问题:
main = do
$(thiswontwork)
被解析为 main = do $ thiswontwork
并生成 Empty 'do' block
消息。
将 {-# LANGUAGE TemplateHaskell #-}
添加到 State.hs
文件的顶部足以解决问题。
我尝试在 yesod / haskell 中使用名为 state 的处理程序创建新路由,但出现错误 empty 'do' block
复现步骤如下:
- 创建新的 yesod 应用程序:
stack new haskellYesod yesodweb/simple
yesod add-handler
用于添加带有参数的新处理程序:- 路线名称:州
- 路由模式:/state/
- 方法:获取
- 在
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
问题是缺少扩展名。添加以下内容后,错误消失:
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
发生的事情是,如果没有 TemplateHaskell
扩展名,语法 $(...)
将无法按预期识别。相反,它被解析为 do-block,后跟运算符 $
,然后是表达式 (...)
,就像您写的一样:
getStateR = do
defaultLayout $ (do $ widgetFile "bla")
^^ empty do-block
您会在独立程序中看到同样的问题:
main = do
$(thiswontwork)
被解析为 main = do $ thiswontwork
并生成 Empty 'do' block
消息。
将 {-# LANGUAGE TemplateHaskell #-}
添加到 State.hs
文件的顶部足以解决问题。