Vacíe do block yesod después de crear un nuevo controlador
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:
- Crear nueva aplicación yesod:
stack new haskellYesod yesodweb/simple
yesod add-handler
para agregar un nuevo controlador con los parámetros:- Nombre de la ruta: Estado
- Patrón de ruta: /estado/
- Métodos: OBTENER
- Agregue el siguiente código en
src/Handler/State.hs
module Handler.State where
import Import
getStateR :: Handler Html
getStateR = do
defaultLayout $ do
$(widgetFile "bla")
- Crear un sitio HTML simple
templates/bla.hamlet
:
<h1> BLA!
- Iniciar servidor con
stack 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
Lo que sucede es que sin la TemplateHaskell
extensió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 $ thiswontwork
y genera un Empty 'do' block
mensaje.
Agregar {-# LANGUAGE TemplateHaskell #-}
a la parte superior del State.hs
archivo es suficiente para solucionar el problema.
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 #-}