Where is parseRoutesNoCheck in Yesod
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 ... do开发者_Go百科ne.
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"]]'
It seems that I'm using wrong parseRoutesNoCheck, but where is the correct Module?
simple_yesod.hs is below.
{-# 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 using Glasgow Haskell Compiler, Version 7.0.3 and yesod-core-0.9.2.
You should simply use parseRoutes
rather than parseRoutesNoCheck
. Also you might want to add a module Main where
and remove import Web.Routes.Quasi.Parse
since the Yesod
module already exports parseRoutes
.
Here is the complete code with the modifications I mentioned.
{-# LANGUAGE TypeFamilies, QuasiQuotes, TemplateHaskell, MultiParamTypeClasses, OverloadedStrings #-}
module Main where
import Yesod
import qualified Text.Blaze.Html5 as H
data Test = Test {
}
mkYesod "Test" [parseRoutes|
/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}
A good idea is to try to copy existing examples when you're in the learning phase of Yesod (and everything else for that matter). Code snippets are often found in the Yesod book or in github repos, one can learn from those sources.
Edit: I lack a complete answer. Apperently nowadays the parseRoutes
and family lies in "Yesod.Dispatch" which only is reexporting from the hidden module Yesod.Internal.RouteParsing. parseRoutesNoCheck
is defined in Yesod.Internal.RouteParsing
but never exposed, since you probably always want checking of non-overlapping routes.
I hope this clarifies a bit more.
精彩评论