You don't have javascript enabled. Good luck! :(
記事公開日: 2018/08/04
最終更新日: 2020/03/03

whamlet と julius

この問題は ToJavascript instance of String and Text #227 で解決されました。

whamlet の中で Text 型を展開する場合

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# LANGUAGE TypeFamilies      #-}
import Data.Text
import Yesod

data App = App

mkYesod "App" [parseRoutes|
/ HomeR GET
|]

instance Yesod App

getHomeR :: Handler Html
getHomeR = defaultLayout $ do
  let name = "bigmoon" :: Text

  [whamlet|
    #{name}
  |]

main :: IO ()
main = warp 3000 App

この場合 #{name} を展開する時に toHtml が呼ばれ Text 型が Html 型に変換されます。

julius の中で Text 型を展開する場合

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# LANGUAGE TypeFamilies      #-}
import ata.Text
import Yesod

data App = App

mkYesod "App" [parseRoutes|
/ HomeR GET
|]

instance Yesod App

getHomeR :: Handler Html
getHomeR = defaultLayout $ do
  let name = "bigmoon" :: Text

  toWidget [julius|
    #{name}
  |]

main :: IO ()
main = warp 3000 App

この場合 #{name} を展開する時に toJavascript が呼ばれますが、インスタンス定義に Text 型が含まれていないためエラーとなります。

/home/bm12/Desktop/repo/site-doc/haskell-blog/sample-code/yesod/Tips1.hs:26:20: error:
No instance for (shakespeare-2.0.15:Text.Julius.ToJavascript
                         Text)
        arising from a use of ‘shakespeare-2.0.15:Text.Julius.toJavascript’