Несоответствие типов полей в Yesod custom settings.yml

Я пытаюсь создать новое поле в моем файле settings.yml для расположения моего статического файла (чтобы я мог перейти с локального подкаталога в разработке на CDN в производстве), но мне кажется, что я не могу получить базовый "привет" Мир "собирается. Вот мой Settings.hs:

data Extra = Extra
    { extraCopyright :: Text
    , extraAnalytics :: Maybe Text -- ^ Google Analytics
    , extraStatic :: Text
    } deriving Show

parseExtra :: DefaultEnv -> Object -> Parser Extra
parseExtra _ o = Extra
    <$> o .:  "copyright"
    <*> o .:? "analytics"
    <*> o .:  "static"

А вот и соответствующая часть settings.yml:

Default: &defaults
  host: "*4" # any IPv4 host
  port: 3000
  approot: "http://localhost:3000"
  copyright: Insert copyright statement here
  #analytics: UA-YOURCODE
  static: "/static"

И, наконец, часть, которая выдает ошибку. Я действительно не знал, как я должен был включить его значение в запрос, поэтому я просто добавил код, который будет выполняться при каждом запросе:

getHomeR :: Handler Html
getHomeR = do
    (formWidget, formEnctype) <- generateFormPost sampleForm
    let submission = Nothing :: Maybe (FileInfo, Text)
        handlerName = "getHomeR" :: Text
        test = fmap extraStatic getExtra
    defaultLayout $ do
        aDomId <- newIdent
        setTitle "Welcome To Yesod!"
        $(widgetFile "homepage")

И у меня есть та же строка, добавленная на postHomeR, а также (test = fmap extraStatic getExtra). Моя деревня:

<p>#{test}

И, наконец, ошибка, выдаваемая на экран:

Handler/Home.hs:37:11:
    No instance for (blaze-markup-0.5.1.5:Text.Blaze.ToMarkup
                       (HandlerT App IO Text))
      arising from a use of `toHtml'
    Possible fix:
      add an instance declaration for
      (blaze-markup-0.5.1.5:Text.Blaze.ToMarkup (HandlerT App IO Text))
    In the first argument of `Yesod.Core.Widget.asWidgetT
                              . toWidget', namely
       `toHtml test'
    In a stmt of a 'do' block:
      (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml test)
    In a stmt of a 'do' block:
      do { (Yesod.Core.Widget.asWidgetT . toWidget)
             ((blaze-markup-0.5.1.5:Text.Blaze.Internal.preEscapedText
               . Data.Text.pack)
                "<h1>");
           ((Control.Monad.liftM (toHtml .) getMessageRender)
            >>=
               (\ urender_aaYh
                 -> (Yesod.Core.Widget.asWidgetT . toWidget)
                       (urender_aaYh MsgHello)));
          (Yesod.Core.Widget.asWidgetT . toWidget)
             ((blaze-markup-0.5.1.5:Text.Blaze.Internal.preEscapedText
               . Data.Text.pack)
                "</h1>\
                \<ol><li>Now that you have a working project you should use the <a href=\"http://www.yesodweb.com/book/\">Yesod book</a> to learn more. You can also use this scaffolded site to explore some basic concepts.</li><li> This page was generated by the ");
           (Yesod.Core.Widget.asWidgetT . toWidget) (toHtml handlerName);
           .... }
Build failure, pausing...

Есть ли способ, которым я могу разыграть это? Можно ли как-нибудь сделать так, чтобы переменная была назначена и загружена во время запуска приложения, но была доступна во всех запросах как постоянное значение? Любая помощь будет принята с благодарностью!

1 ответ

Решение

Проблема в:

let test = fmap extraStatic getExtra

getExtra это Handler действие, так что вы хотите это:

test <- fmap extraStatic getExtra
Другие вопросы по тегам