代码之家  ›  专栏  ›  技术社区  ›  paul

执行块解析类型

  •  0
  • paul  · 技术社区  · 6 年前

    我最近刚开始在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
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   augustss    6 年前

    让我们考虑以下函数:

    persistUser :: Maybe User -> ActionT Text IO (Maybe User)
    

    类型值 Maybe User (<$>) (或 fmap )功能如下:

    insertUser <$> maybeUser
    

    结果类型为: Maybe (IO User) lift 此类型到 ActionT Text IO (Maybe User)

    Web.Scotty.Trans 有一个 liftAndCatchIO 功能(也可在 Web.Scotty IO a 作为一个论点,我们需要“交换” Maybe IO . 让我们 find sequence 做我们需要的。

    因此,我们有以下实现 persistUser

    persistUser maybeUser =
        liftAndCatchIO $ sequence $ insertUser <$> maybeUser
    
    推荐文章