【问题标题】:Where is parseRoutesNoCheck in YesodYesod中的parseRoutesNoCheck在哪里
【发布时间】:2011-10-02 03:20:02
【问题描述】:

我开始学习 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。

【问题讨论】:

    标签: haskell yesod


    【解决方案1】:

    您应该简单地使用parseRoutes 而不是parseRoutesNoCheck。此外,您可能需要添加module Main where 并删除import Web.Routes.Quasi.Parse,因为Yesod 模块已经导出parseRoutes

    这是我提到的修改后的完整代码。

    {-# 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}
    

    当您处于 Yesod 的学习阶段(以及与此相关的所有其他内容)时,尝试复制现有示例是一个好主意。代码 sn-ps 经常在 Yesod book 或 github repos 中找到,可以从这些资源中学习。


    编辑:我缺乏完整的答案。显然现在parseRoutes 和家庭位于"Yesod.Dispatch",它只是从隐藏模块Yesod.Internal.RouteParsing 重新导出。 parseRoutesNoCheckYesod.Internal.RouteParsing 中定义但从未公开,因为您可能总是希望检查非重叠路由。

    我希望这能澄清一点。

    【讨论】:

    • 感谢您的回答。我遵循 Yesod 书中的例子(这真的很棒)。所以我知道 parseRoutes 适用于代码。但我正在尝试使用 parseRoutesNoCheck,因为我想将 Yesod 定义为:mkYesod "Test" [parseRoutes| /page/#String PageR GET /#String UserR GET |] 并且 Yesod.Dispatch 没有 parseRoutesNoCheck。 Prelude Main Yesod.Dispatch&gt; :type parseRoutesNoCheck &lt;interactive&gt;:1:1: Not in scope: parseRoutesNoCheck'`
    • 所以,如果 parseRoutesNoCheck 不再可用,我更改 Yesod 定义,使其只有不重叠的路由。
    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多