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

输入值为期望值的IO Monad

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

    我在哈斯凯尔是个新手,但我仍然无法理解关于monads的do块是如何工作的。

    例如,考虑使用我返回整数的do块 IO Integer

    getNumber :: IO Integer -- A IO monad of type Integer
    getNumber = return 100
    

    但是,例如,有一个返回可能用户的do块,do块的类型是 Maybe User 但我一直在期待 IO (Maybe User)

    persistUser :: IO (Maybe User)
    persistUser = do return Just(User { userId = 100, userName = "Paul" })
    

    相反,代码甚至没有编译。我无法计算错误编译。

    • Couldn't match type ‘a0 -> Maybe a0’ with ‘IO (Maybe User)’
      Expected type: User -> IO (Maybe User)
        Actual type: User -> a0 -> Maybe a0
    • The function ‘return’ is applied to two arguments,
      but its type ‘(a0 -> Maybe a0) -> User -> a0 -> Maybe a0’
      has only three
      In a stmt of a 'do' block:
        return Just (User {userId = 100, userName = "Paul"})
      In the expression:
        do { return Just (User {userId = 100, userName = "Paul"}) }
    

    似乎期望用户作为输入,但甚至添加签名

    User -> IO (Maybe User) User IO (Maybe User) 不起作用。

    也许我对文件中的某些内容感到怀疑。澄清一下这件事会很好!!

    当做。

    2 回复  |  直到 6 年前
        1
  •  4
  •   Daniel Wagner    6 年前

    do return (Just(User { userId = 100, userName = "Paul" }))
    

    return

        2
  •  1
  •   chepner    6 年前

    . return Just

    getNumber = return . Just $ User { userId = 100, userName = "Paul" }
    

    $ return . Just (User { userId = 100, userName = "Paul" }) return = Just Maybe return . return $ User { userId = 100, userName = "Paul" }

    do