gpt4 book ai didi

haskell - 理解 Haskell 中的 $

转载 作者:行者123 更新时间:2023-12-02 15:25:00 24 4
gpt4 key购买 nike

我很难理解以下代码(在 IO 之上的 ErrorT monad 中执行):

closePort [Port port] = liftIO $ hClose port >> (return $ Bool True)

>> 的优先级高于 $。那么是 Bool True 首先包装在 IO 中,然后用 liftIO 提升,还是先提升 hClose ?换句话说, >>return 是在 IO monad 中执行还是在 ErrorT monad 中执行?

最佳答案

在这种情况下,您实际上不必担心优先级,因为

liftIO (hClose port >> return (Bool True))

liftIO (hClose port) >> return (Bool True)

由于单子(monad)变换定律,必须是等价的,它说

  1. 提升return不会执行任何操作。

    lift . return = return
  2. 提升一系列两个操作与分别提升它们相同。

    lift (m >>= f) = lift m >>= (lift . f)

liftIO 也应该遵循这些规律,所以我们可以看到

liftIO (hClose port >> return (Bool True))
= -- definition of >>
liftIO (hClose port >>= \_ -> return (Bool True))
= -- second monad transformer law
liftIO (hClose port) >>= \_ -> liftIO (return (Bool True))
= -- first monad transformer law
liftIO (hClose port) >>= \_ -> return (Bool True)
= -- definition of >>
liftIO (hClose port) >> return (Bool True)

关于haskell - 理解 Haskell 中的 $,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9888749/

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