我一直试图在路线中使用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
做对了。
答案 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