Kosongkan do block yesod setelah membuat handler baru
Saya mencoba membuat rute baru di yesod / haskell dengan penangan yang disebut status, tetapi saya mendapatkan kesalahan empty 'do' block
Langkah-langkah untuk mereproduksi adalah sebagai berikut:
- Buat aplikasi yesod baru:
stack new haskellYesod yesodweb/simple
yesod add-handler
untuk menambahkan penangan baru dengan params:- Nama rute: Negara bagian
- Pola Rute: / state /
- Metode: GET
- Tambahkan kode berikut di
src/Handler/State.hs
module Handler.State where
import Import
getStateR :: Handler Html
getStateR = do
defaultLayout $ do $(widgetFile "bla")
- Buat situs HTML sederhana
templates/bla.hamlet
:
<h1> BLA!
- Mulai server dengan
stack exec yesod devel
Setelah itu saya mendapatkan error:
src/Handler/State.hs:7:21: error: Empty 'do' block
|
7 | defaultLayout $ do
Jawaban
Apa yang terjadi adalah tanpa TemplateHaskell
ekstensi, sintaksis $(...)
tidak dikenali sebagaimana dimaksud. Sebaliknya, ini diurai sebagai blok-do diikuti oleh operator $
dan kemudian ekspresi (...)
, seolah-olah Anda akan menulis:
getStateR = do
defaultLayout $ (do $ widgetFile "bla")
^^ empty do-block
Anda akan melihat masalah yang sama dengan program mandiri:
main = do
$(thiswontwork)
yang diurai sebagai main = do $ thiswontwork
dan menghasilkan Empty 'do' block
pesan juga.
Menambahkan {-# LANGUAGE TemplateHaskell #-}
ke bagian atas State.hs
file sudah cukup untuk memperbaiki masalah.
Masalahnya adalah ekstensi hilang. Setelah menambahkan yang berikut ini, kesalahan tersebut menghilang:
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}