Yesod路线包含一个`Maybe a`参数

时间:2014-06-22 15:25:58

标签: haskell routes yesod maybe

我一直试图在路线中使用Maybe a。到目前为止我试过

/u/#Maybe UserId
/u/#(Maybe UserId)
/u/#Maybe-UserId

/u/#MaybeUserId

,其中

type MaybeUserId = Maybe UserId

但没有太大的成功。

奇怪的是,#Maybe-UserId使用Maybe UserId处理程序编译得很好但是,即使使用下面的新PathPiece实例也无法找到匹配项。

instance (PathPiece a) => PathPiece (Maybe a) where
    fromPathPiece s = case s of
        "Nothing" -> Nothing
        _ -> Just $ fromPathPiece s
    toPathPiece m = case m of
        Just s -> toPathPiece s
        _ -> "Nothing"

创建Maybe路由时我缺少什么,而不必为我想要使用的每个Maybe a声明一个类型和实例?

编辑:由于某种原因,当使用Ǹothing以外的任何内容时,该实例正常工作。

edit2: "Nothing" -> Nothing实际上表示PathPiece解析失败,这不是理想的结果。 "Nothing" -> Just Nothing做对了。

2 个答案:

答案 0 :(得分:4)

具有空参数(以斜杠结尾)的路由将恢复为以前一个路径块结尾的路由,因此“/ u /”将永远不会匹配“/ u /#MaybeUserId”

因此,您的可选 UserId 命题中有两种不同的路由:

/u  UserNoIdR  GET

/u/#UserId  UserWithIdR GET

更新

如果您愿意,可以从公共处理程序中为它们提供服务:

getUserNoIdR = getUserMaybe Nothing

getUserWithIdR userId = getUserMaybe (Just userId)

答案 1 :(得分:1)

对于来自Google的所有人,以下确实是正确的路由语法:

/user/#Maybe-UserId    UserR GET

表示处理程序:

getUserR :: Maybe UserId -> Handler Html

您可以使用网址访问

/user/Nothing  -> Nothing
/user/Just%207 -> Just 7