새 핸들러 생성 후 비어있는 do 블록 yesod
Aug 21 2020
상태라는 핸들러를 사용하여 yesod / haskell에 새 경로를 만들려고하는데 오류가 발생합니다. empty 'do' block
재현하는 단계는 다음과 같습니다.
- 새 yesod 응용 프로그램을 만듭니다.
stack new haskellYesod yesodweb/simple
yesod add-handler
매개 변수로 새 핸들러를 추가하려면 :- 경로 이름 : 주
- 경로 패턴 : / state /
- 방법 : GET
- 다음 코드를 추가하십시오.
src/Handler/State.hs
module Handler.State where
import Import
getStateR :: Handler Html
getStateR = do
defaultLayout $ do $(widgetFile "bla")
- 간단한 HTML 사이트 만들기
templates/bla.hamlet
:
<h1> BLA!
- 다음으로 서버 시작
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 #-}