我最近刚开始在Haskell中编写代码,我开始使用 . 我来自Scala world,在读了一本书和一些博客后我看到了 do块 是我们从理解中得到的灵感。但我仍在努力处理作为输入传递给每个函数的参数->输出
在我的代码中,我使用scotty http服务器库来获取请求,并尝试将该请求持久化到mySQL中。
但在这一行中,我尝试从Maybe获取值,并将其发送到要持久化的另一个函数
user <- (fmap (\user -> insertUser user) maybeUser)
它从不编译,因为函数不返回所需的类型
操作文本IO(可能是用户)
但是
IO用户
这里是我的洞程序
createUser :: ActionM () createUser = do maybeUser <- getUserParam -- Persist the user _ <- persistUser json maybeUser getUserParam :: ActionT Text IO (Maybe User) getUserParam = do requestBody <- body return (decode requestBody) persistUser :: Maybe User -> ActionT Text IO (Maybe User) persistUser _maybeUser = let maybeUser = _maybeUser in do user <- maybeUser user <- (fmap (\user -> insertUser user) maybeUser) return maybeUser insertUser :: User -> IO User insertUser _user = let user = _user in do conn <- createConnection status <- execute conn insertUserQuery [MySQLInt32 (intToInt32 $ getUserId user), MySQLText "hello_haskell_world"] return user
让我们考虑以下函数:
persistUser :: Maybe User -> ActionT Text IO (Maybe User)
类型值 Maybe User (<$>) (或 fmap )功能如下:
Maybe User
(<$>)
fmap
insertUser <$> maybeUser
结果类型为: Maybe (IO User) lift 此类型到 ActionT Text IO (Maybe User)
Maybe (IO User)
ActionT Text IO (Maybe User)
Web.Scotty.Trans 有一个 liftAndCatchIO 功能(也可在 Web.Scotty IO a 作为一个论点,我们需要“交换” Maybe 和 IO . 让我们 find sequence 做我们需要的。
Web.Scotty.Trans
Web.Scotty
IO a
Maybe
IO
因此,我们有以下实现 persistUser
persistUser
persistUser maybeUser = liftAndCatchIO $ sequence $ insertUser <$> maybeUser