새 핸들러 생성 후 비어있는 do 블록 yesod

Aug 21 2020

상태라는 핸들러를 사용하여 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

답변

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

무슨 일이 일어나고 있는지 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하면 문제를 해결할 수 있습니다.

Sandro_V Aug 20 2020 at 23:32

문제는 확장 기능이 누락되었습니다. 다음을 추가하면 오류가 사라졌습니다.

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