2011-09-21 77 views
1
{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-} 
import Yesod 

data Entry = Entry 
    { entryTitle :: String 
    , entrySlug :: String --^used in the URL 
    , entryContent :: String 
    } 

loadEntries :: IO [Entry] 
loadEntries = return 
    [ Entry "Entry 1" "entry-1" "My first entry" 
    , Entry "Entry 2" "entry-2" "My second entry" 
    , Entry "Entry 3" "entry-3" "My third entry" 
    ] 

data Blog = Blog { blogEntries :: [Entry] } 

type Handler = GHandler Blog Blog 

mkYesod "Blog" [parseRoutes| 
/    HomeR GET 
/entry/#String EntryR GET 
|] 

instance Yesod Blog where approot _ = "" 

getHomeR :: Handler() 
getHomeR = do 
    Blog entries <- getYesod 
    let newest = last entries 
    redirect RedirectTemporary $ EntryR $ entrySlug newest 

data TemplateArgs = TemplateArgs 
    { templateTitle :: Html 
    , templateContent :: Html 
    , templateNavbar :: [Nav] 
    } 

data Nav = Nav 
    { navUrl :: Route Blog 
    , navTitle :: Html 
    } 

entryTemplate :: TemplateArgs -> Hamlet (Route Blog) 
entryTemplate args = [hamlet| 
    !!! 

    <html> 
     <head> 
      <title>#{templateTitle args} 
     <body> 
      <h1>Yesod Sample Blog 
      <h2>#{templateTitle args} 
      <ul id="nav"> 
       $forall nav <- templateNavbar args 
        <li> 
         <a href="@{navUrl nav}">#{navTitle nav} 
      <div id="content"> 
       \#{templateContent args} 
    |] 

getEntryR :: String -> Handler RepHtml 
getEntryR slug = do 
    Blog entries <- getYesod 
    case filter (\e -> entrySlug e == slug) entries of 
     [] -> notFound 
     (entry:_) -> do 
      let nav = reverse $ map toNav entries 
      let tempArgs = TemplateArgs 
        { templateTitle = toHtml $ entryTitle entry 
        , templateContent = toHtml $ entryContent entry 
        , templateNavbar = nav 
        } 
      hamletToRepHtml $ entryTemplate tempArgs 
    where 
    toNav :: Entry -> Nav 
    toNav e = Nav 
     { navUrl = EntryR $ entrySlug e 
     , navTitle = toHtml $ entryTitle e 
     } 

main :: IO() 
main = do 
    entries <- loadEntries 
    warpDebug 3000 $ Blog entries 

$ runghc Blog.hs 

Blog.hs:21:1: 
    Multiple declarations of `Handler' 
    Declared at: Blog.hs:19:6 
       Blog.hs:21:1 

回答

1

最新耶索德的編譯錯誤,現在會自動聲明的處理程序類型別名。只要刪除type Handler = ...行,它應該工作。我會更新圖書,我想我的檢查腳本還沒有在Literate Haskell代碼上工作。

+0

'Blog.hs:43:34:不在範圍內:類型構造函數或類'Hamlet'' – wenlong