2016-07-30 2 views
1

Ich versuche zu verstehen, wie man Heist benutzt, aber keines der Beispiele, die ich finde, scheint zu funktionieren und ich kann nicht finden, dass jemand anderes das hat das gleiche Problem, das ich bin. Ich fand hier einige Beispiel-Code:Heist Beispiel funktioniert nicht: 'hcCompiledSplices' ist kein Datensatzselektor

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

Allerdings, wenn ich versuchen, das erste Beispiel auszuführen, ich folgende Fehlermeldung erhalten:

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 } 

Was mache ich falsch?

+1

Verwenden Sie 'heist-0.14. *'? Einige Sachen bewegten sich herum, vgl. [CHANGELOG.md] (https://github.com/snapframework/heist/blob/master/CHANGELOG.md#0140). –

Antwort

3

Die Verwendung von Objektiven scheint der Weg zu sein, Dinge jetzt zu tun.

Außerdem ändere ich die Vorlage simple.tpl, um das Tag <h:foo>...</h:foo> anstelle von nur <foo>...</foo> zu verwenden.

{-# 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 
+0

Danke !! Kannst du den 'h:' -Teil erklären? Warum musstest du das tun? Muss ich das jetzt immer tun? – Emil

+0

Ich tat es, weil das die Fehlermeldung war. Versuchen Sie, nur mit dem Tag "" zu laufen, und Sie sehen die vollständige Fehlermeldung. Zweifellos ist das Präfix konfigurierbar. – ErikR

+0

Wirklich? Weil ich nur 'oops' sehe. – Emil

Verwandte Themen