创建新处理程序后清空 do 块 yesod

Empty do block yesod after creating new handler

我尝试在 yesod / haskell 中使用名为 state 的处理程序创建新路由,但出现错误 empty 'do' block

复现步骤如下:

  1. 创建新的 yesod 应用程序:stack new haskellYesod yesodweb/simple
  2. yesod add-handler 用于添加带有参数的新处理程序:
    • 路线名称:州
    • 路由模式:/state/
    • 方法:获取
  3. src/Handler/State.hs
  4. 中添加如下代码
module Handler.State where

import Import

getStateR :: Handler Html
getStateR = do
    defaultLayout $ do
        $(widgetFile "bla")

  1. 创建简单的 HTML 站点 templates/bla.hamlet:
<h1> BLA!
  1. stack exec yesod devel
  2. 启动服务器

之后我得到错误:

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 文件的顶部足以解决问题。