Kosongkan do block yesod setelah membuat handler baru

Aug 21 2020

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:

  1. Buat aplikasi yesod baru: stack new haskellYesod yesodweb/simple
  2. yesod add-handler untuk menambahkan penangan baru dengan params:
    • Nama rute: Negara bagian
    • Pola Rute: / state /
    • Metode: GET
  3. Tambahkan kode berikut di src/Handler/State.hs
module Handler.State where

import Import

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

  1. Buat situs HTML sederhana templates/bla.hamlet:
<h1> BLA!
  1. 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

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

Apa yang terjadi adalah tanpa TemplateHaskellekstensi, 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 $ thiswontworkdan menghasilkan Empty 'do' blockpesan juga.

Menambahkan {-# LANGUAGE TemplateHaskell #-}ke bagian atas State.hsfile sudah cukup untuk memperbaiki masalah.

Sandro_V Aug 20 2020 at 23:32

Masalahnya adalah ekstensi hilang. Setelah menambahkan yang berikut ini, kesalahan tersebut menghilang:

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