I started to learn Haskell language and Yesod web framework. When I tried to use "parseRoutesNoCheck" for mkYesod, however, the compiler could not match the return type (Resource) of parseRoutesNoCheck.
$ ghc simple_yesod.hs
[1 of 1] Compiling Main ( simple_yesod.hs, simple_yesod.o )
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Loading package bytestring-0.9.1.10 ... linking ... done.
Loading package array-0.3.0.2 ... linking ... done.
Loading package containers-0.4.0.0 ... linking ... done.
Loading package deepseq-1.1.0.2 ... linking ... done.
Loading package text-0.11.0.6 ... linking ... done.
Loading package path-pieces-0.0.0 ... linking ... done.
Loading package pretty-1.0.1.2 ... linking ... done.
Loading package template-haskell ... linking ... done.
Loading package web-routes-quasi-0.7.1 ... linking ... done.
simple_yesod.hs:9:36:
Couldn t match expected type `yesod-core-0.9.2:Yesod.Internal.RouteParsing.Resource
with actual type `Resource
In the return type of a call of `Resource
In the expression:
Resource "PageR" [StaticPiece "page", SinglePiece "String"] ["GET"]
In the second argument of `mkYesod , namely
`[Resource
"PageR" [StaticPiece "page", SinglePiece "String"] ["GET"],
Resource
"UserR" [StaticPiece "user", SinglePiece "String"] ["GET"]]
看来,Im使用错误的 par子,但正确的模块在哪里?
简单易懂。
{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
import Yesod
import Web.Routes.Quasi.Parse
import qualified Text.Blaze.Html5 as H
data Test = Test {
}
mkYesod "Test" [parseRoutesNoCheck|
/page/#String PageR GET
/user/#String UserR GET
|]
instance Yesod Test where
approot _ = ""
defaultLayout widget = do
content <- widgetToPageContent widget
hamletToRepHtml [hamlet|
<!DOCTYPE html>
<html>
<head>
<title>#{pageTitle content}
<body>
<ul id="navbar">
<div id="content">
^{pageBody content}
|]
getUserR :: String -> Handler RepHtml
getUserR userName = defaultLayout
(do
setTitle $ H.toHtml $ "Hello " ++ userName
addHamlet $ html userName
)
where
html page = [hamlet|
<h1>User: #{userName}
<p>This page is for user: #{userName}
|]
getPageR :: String -> Handler RepHtml
getPageR pageName = defaultLayout
(do
setTitle $ H.toHtml $ "Article: " ++ pageName
addHamlet $ html pageName
)
where
html page = [hamlet|
<h1>Page: #{pageName}
<p>This page is for page: #{pageName}
|]
main :: IO ()
main = do
warpDebug 3000 $ Test
I m 采用Glas Haskell Compiler, 第7.0.3版,是正分-0.9.2。