4

我一直在尝试Maybe a在路线中使用 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做正确的事。

4

2 回答 2

4

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

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

/u  UserNoIdR  GET

/u/#UserId  UserWithIdR GET

更新

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

getUserNoIdR = getUserMaybe Nothing

getUserWithIdR userId = getUserMaybe (Just userId)
于 2014-06-22T15:54:21.677 回答
3

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

/user/#Maybe-UserId    UserR GET

对于处理程序:

getUserR :: Maybe UserId -> Handler Html

您可以通过 URL 访问

/user/Nothing  -> Nothing
/user/Just%207 -> Just 7
于 2017-10-12T12:50:19.020 回答