【问题标题】:Empty do block yesod after creating new handler创建新处理程序后,清空 do 阻止 yesod
【发布时间】:2020-12-10 01:00:21
【问题描述】:

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

重现的步骤如下:

  1. 创建新的 yesod 应用程序:stack new haskellYesod yesodweb/simple
  2. yesod add-handler 用于添加带有参数的新处理程序:
    • 路线名称:州
    • 路由模式:/state/
    • 方法:GET
  3. src/Handler/State.hs中添加以下代码
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 启动服务器

之后我得到错误:

src/Handler/State.hs:7:21: error: Empty 'do' block
  |
7 |     defaultLayout $ do

【问题讨论】:

    标签: haskell yesod


    【解决方案1】:

    发生的情况是,如果没有 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 文件的顶部足以解决问题。

    【讨论】:

      【解决方案2】:

      问题是缺少扩展。添加以下内容后,错误消失了:

      {-# LANGUAGE NoImplicitPrelude #-}
      {-# LANGUAGE OverloadedStrings #-}
      {-# LANGUAGE TemplateHaskell #-}
      {-# LANGUAGE MultiParamTypeClasses #-}
      {-# LANGUAGE TypeFamilies #-}
      

      【讨论】:

      • 请编辑您的问题以添加此信息。它不属于答案。
      • 是的,我做到了。但为什么?因为这个答案是问题的解决方案吧?
      • @Sandro_V 如果您说添加这些扩展解决了您的问题:那么是的,这应该在答案中。另一方面,如果您说您忘记在问题中指定这些扩展名,但添加它们仍然不能解决您的问题:那么不,这不应该是一个答案。
      • 这是一个答案,而不是对问题的补充,所以我恢复了对问题的更改并更新了这个答案以明确这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多