gpt4 book ai didi

haskell - 简化 Haskell 代码

转载 作者:行者123 更新时间:2023-12-02 10:43:23 26 4
gpt4 key购买 nike

我正在 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 进行模式匹配。我正在做事情,所以这里应该有一些东西。另一件事是,我在 register 中也有一个 do 。任何指示表示赞赏。

最佳答案

您的新代码没有任何问题。它比原始文件长的部分原因是您正在处理 Nothing情况,您最初没有这样做(因此您的新代码更安全)。如果你想稍微整理一下,你可以写成

handleNewUserPost :: Handler App (AuthManager App) ()
handleNewUserPost =
getPostParam "login" >>= maybe (redirect "/new_user") validateUser
where
validateUser username = do
exists <- usernameExists $ T.decodeUtf8 username
if exists
then handerNewUserGet $ Just "Sorry, this username already exists."
else do
registerUser "login" "password"
redirect "/new_user"

我在哪里使用了函数maybe来自Data.Maybe无需显式处理 JustNothing值(value)观。该函数刚刚定义为

maybe :: b -> (a -> b) -> Maybe a -> b
maybe b _ Nothing = b
maybe _ f (Just a) = f a

关于haskell - 简化 Haskell 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21061910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com