私は Yesod を使い始めたばかりで、すでにいくつかの興味深い結果が得られていますが、その型のいくつかを明確に理解するのに苦労しています (おそらく Template Haskell に慣れていないためです)。
hamlet スニペットを defaultLayout 関数に渡す通常の方法は、toWidget 関数を使用することです。以下の ham1 と ham2 の定義に従うと、defaultLayout 内の適切な指示はそれぞれtoWidget ham1
とham2
です。
私の質問:次の (動作中の) コードtoWidget ham2
では、ham1 とは非常に異なる動物であるのに、命令がコンパイルされるのはなぜですか? ham1 :: t -> Text.Blaze.Internal.Markup
これは、ham1 の型 ( (*) ) と ham2 の型 ( ) の両方が ToWidget クラスのインスタンスであることを意味していると思いますが、このクラスのインスタンス定義ham2 :: Widget
を読んでも、それは完全には明らかではありません。
(*)また、誰かがt -> Text.Blaze.Internal.Markup
ham1 よりも「より適切な」タイプのシノニムがあれば教えていただければ幸いです。
コード:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Yesod
import Text.Blaze.Internal (Markup)
data App = App
instance Yesod App
mkYesod "App" [parseRoutes|
/ HomeR GET
|]
getHomeR :: Handler Html
getHomeR = defaultLayout $ do
setTitle "Some Title"
toWidget ham1 -- usual way to produce a Widget from hamlet snippet
toWidget ham2 -- ??
ham2 -- already of type Widget
ham1 :: t -> Text.Blaze.Internal.Markup -- explicit signature for reference only
ham1 = [hamlet|
<h1> 1) Hello
<h2> World!
|]
ham2 :: Widget
ham2 =
toWidget [hamlet|
<h1> 2) Hello
<h2> World!
|]
main :: IO ()
main = do
warp 3000 App
出力: