Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 可配置的路径前缀_Haskell_Yesod_Template Haskell - Fatal编程技术网

Haskell 可配置的路径前缀

Haskell 可配置的路径前缀,haskell,yesod,template-haskell,Haskell,Yesod,Template Haskell,我有以下web服务器: {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} import Data.Text (Text) import Yesod data App = App mkYesod "App" [pa

我有以下web服务器:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# LANGUAGE TypeFamilies      #-}
import           Data.Text        (Text)
import           Yesod

data App = App

mkYesod "App" [parseRoutes|
/      HomeR  GET
/link1 Link1R GET
/link2 Link2R GET
/link3 Link3R GET
/link4 Link4R GET
|]

instance Yesod App where

getHomeR :: Handler Html
getHomeR = defaultLayout $ do
    setTitle "Redirects"
    [whamlet|
        <p>
            <a href=@{Link1R}>Click to start the redirect chain!
    |]

getLink1R, getLink2R, getLink3R :: Handler ()
getLink1R = redirect Link2R -- /link2
getLink2R = redirect (Link3R, [("foo", "bar")]) -- /link3?foo=bar
getLink3R = redirect $ Link4R :#: ("baz" :: Text) -- /link4#baz

getLink4R :: Handler Html
getLink4R = defaultLayout
    [whamlet|
        <p>You made it!
    |]

main :: IO ()
main = warp 3000 App
我如何做到这一点


我尝试了
approt
,但似乎不起作用…

我正在使用
cleanPath
删除前缀:

    cleanPath app s =
        if corrected == s
            then Right $ dropPrefix $ map dropDash s
            else Left corrected
      where
        corrected = filter (not . T.null) s
        dropDash t
            | T.all (== '-') t = T.drop 1 t
            | otherwise = t
        dropPrefix s' = case routePrefix $ appSettings app of
            Nothing -> s'
            Just prefix -> case headMay s' of
                            Just t -> if t == prefix then drop 1 s' else ["wrong prefix"]
                            Nothing -> ["wrong prefix"]

如果你知道更好的方法,请评论或添加答案。谢谢

我正在使用
cleanPath
删除前缀:

    cleanPath app s =
        if corrected == s
            then Right $ dropPrefix $ map dropDash s
            else Left corrected
      where
        corrected = filter (not . T.null) s
        dropDash t
            | T.all (== '-') t = T.drop 1 t
            | otherwise = t
        dropPrefix s' = case routePrefix $ appSettings app of
            Nothing -> s'
            Just prefix -> case headMay s' of
                            Just t -> if t == prefix then drop 1 s' else ["wrong prefix"]
                            Nothing -> ["wrong prefix"]

如果你知道更好的方法,请评论或添加答案。谢谢

我不完全确定我是否明白问题是什么。什么不起作用?url前缀来自设置或环境变量。我不确定最好的方法是什么。它应该是编译时还是运行时的变量?如果是后者,那么模板Haskell不可能用于它。两者都可以作为选项。出于学习目的,什么是最好的方法?我对函数式编程相当陌生:)非常感谢!我认为编译时会更好,但我想学习这两种解决方案。我不完全确定我是否理解PPR问题是什么。什么不起作用?url前缀来自设置或环境变量。我不确定最好的方法是什么。它应该是编译时还是运行时的变量?如果是后者,那么模板Haskell不可能用于它。两者都可以作为选项。出于学习目的,什么是最好的方法?我对函数式编程相当陌生:)非常感谢!我认为编译时会更好,但我想学习这两种解决方案。