我开始学习 Haskell 语言和 Yesod Web 框架。但是,当我尝试对 mkYesod 使用“parseRoutesNoCheck”时,编译器无法匹配 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"]]'
看来我使用了错误的 parseRoutesNoCheck,但正确的模块在哪里?
simple_yesod.hs 如下。
{-# 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
我正在使用 Glasgow Haskell 编译器,版本 7.0.3 和 yesod-core-0.9.2。