Пример Heist не работает: "hcCompiledSplices" не является селектором записей

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

https://www.schoolofhaskell.com/school/to-infinity-and-beyond/older-but-still-interesting/compiled-heist-insight-with-no-snap-in-sight

Однако, когда я пытаюсь запустить первый пример, я получаю следующую ошибку:

Main.hs:20:15:
    ‘hcCompiledSplices’ is not a record selector
    In the expression:
    mempty
        {hcCompiledSplices = "foo" ## splice,
        hcTemplateLocations = [loadTemplates "."]}
    In an equation for ‘heistConfig’:
        heistConfig
        = mempty
            {hcCompiledSplices = "foo" ## splice,
            hcTemplateLocations = [loadTemplates "."]}
    In the expression:
    do { let heistConfig = ...;
        heistState <- either (error "oops") id
                        <$> (runEitherT $ initHeist heistConfig);
        builder <- maybe (error "oops") fst
                    $ renderTemplate heistState "simple";
        toByteStringIO B.putStr builder }

Main.hs:22:15:
    ‘hcTemplateLocations’ is not a record selector
    In the expression:
    mempty
        {hcCompiledSplices = "foo" ## splice,
        hcTemplateLocations = [loadTemplates "."]}
    In an equation for ‘heistConfig’:
        heistConfig
        = mempty
            {hcCompiledSplices = "foo" ## splice,
            hcTemplateLocations = [loadTemplates "."]}
    In the expression:
    do { let heistConfig = ...;
        heistState <- either (error "oops") id
                        <$> (runEitherT $ initHeist heistConfig);
        builder <- maybe (error "oops") fst
                    $ renderTemplate heistState "simple";
        toByteStringIO B.putStr builder }

Что я делаю неправильно?

1 ответ

Решение

Использование линз, кажется, способ делать вещи сейчас.

Также я меняю шаблон simple.tpl использовать тег <h:foo>...</h:foo> вместо просто <foo>...</foo>,

{-# LANGUAGE OverloadedStrings  #-}

module Lib2 where

-- import Data.Monoid
import qualified Data.Text as T
import qualified Data.ByteString as B
import Blaze.ByteString.Builder
import Control.Monad
import Control.Monad.IO.Class
import Control.Applicative
import Control.Monad.Trans.Either
import Heist
import Heist.Compiled as C
import Control.Lens

runtime :: RuntimeSplice IO T.Text
runtime = liftIO $ do
    putStrLn "Write something:"
    T.pack <$> getLine

splice :: Splice IO
splice = return $ C.yieldRuntimeText $ runtime

main = do
    let heistConfig = emptyHeistConfig
          & hcTemplateLocations .~ [ loadTemplates "." ]
          & hcCompiledSplices .~  ( "foo" ## splice )
        reportErrors errs = error ("errors: " ++ unlines errs)
    heistState <- either reportErrors id <$> 
         (runEitherT $ initHeist heistConfig)
    builder <- maybe (error "oops") fst $
         renderTemplate heistState "simple"
    toByteStringIO B.putStr builder
Другие вопросы по тегам