开发者

Where is parseRoutesNoCheck in Yesod

开发者 https://www.devze.com 2023-04-10 15:54 出处:网络
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 parseRoutesNoCh

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号