【发布时间】:2014-01-11 11:54:35
【问题描述】:
我正在处理 Snap 框架中的 Haskell 代码。一切正常,但现在我需要清理一些代码。然而,经过几次尝试,我似乎只有更多的代码。也许有人可以给我一些指点?
这是我的初始代码。问题是,我对 Maybe 值进行模式匹配,这在我看来是非常错误的。所以我想把它排除在外。但是下一行会得到一个Maybe 值,所以我不得不改变它..
handleNewUserPost :: Handler App (AuthManager App) ()
handleNewUserPost = do
Just username <- getPostParam "login"
exists <- usernameExists $ T.decodeUtf8 username
case exists of
True -> handleNewUserGet $ Just "Sorry, this username already exist."
False -> do
registerUser "login" "password"
redirect "/new_user"
最终我想到了这个:
handleNewUserPost :: Handler App (AuthManager App) ()
handleNewUserPost = do
username <- getPostParam "login" -- :t username = Maybe ByteString
validate username
where
validate Nothing = redirect "/new_user"
validate (Just username) = do exists <- existcheck username
if exists
then userexists
else register
existcheck :: C.ByteString -> Handler b (AuthManager b) Bool
existcheck username = (usernameExists . T.decodeUtf8) $ username
userexists = handleNewUserGet $ Just "Sorry, this username already exist."
register = do registerUser "login" "password"
redirect "/new_user"
问题在于我觉得我也不应该对Nothing 进行模式匹配。我在do,所以这里应该有一些东西。另一件事是,我在register 中也有一个do。任何指针表示赞赏。
【问题讨论】:
-
这可能更适合 codereview.stackexchange.com。但基本上我认为你的新代码很好。请记住,您确实通过添加
validate Nothing案例使其更加健壮。
标签: haskell monads haskell-snap-framework