Vacíe do block yesod después de crear un nuevo controlador

Aug 21 2020

Intento crear una nueva ruta en yesod/haskell con un manejador llamado state, pero me sale el errorempty 'do' block

Los pasos para reproducir son los siguientes:

  1. Crear nueva aplicación yesod:stack new haskellYesod yesodweb/simple
  2. yesod add-handlerpara agregar un nuevo controlador con los parámetros:
    • Nombre de la ruta: Estado
    • Patrón de ruta: /estado/
    • Métodos: OBTENER
  3. Agregue el siguiente código ensrc/Handler/State.hs
module Handler.State where

import Import

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

  1. Crear un sitio HTML simple templates/bla.hamlet:
<h1> BLA!
  1. Iniciar servidor constack exec yesod devel

Después de eso me sale el error:

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

Respuestas

2 K.A.Buhr Aug 23 2020 at 04:39

Lo que sucede es que sin la TemplateHaskellextensión, la sintaxis $(...)no se reconoce según lo previsto. En su lugar, se analiza como un bloque do seguido del operador $y luego la expresión (...), como si hubieras escrito:

getStateR = do
    defaultLayout $ (do $ widgetFile "bla")
                     ^^ empty do-block

Vería el mismo problema con el programa independiente:

main = do
    $(thiswontwork)

que también se analiza main = do $ thiswontworky genera un Empty 'do' blockmensaje.

Agregar {-# LANGUAGE TemplateHaskell #-}a la parte superior del State.hsarchivo es suficiente para solucionar el problema.

Sandro_V Aug 20 2020 at 23:32

El problema era que faltaban extensiones. Después de agregar lo siguiente, el error desapareció:

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