我一直在尝试分别打印两个值,并尝试了以下代码:
import System.Directory
main = getCurrentDirectory >>= \x -> (print <$> doesFileExist x) >> (print <$> doesDirectoryExist x)但是它不打印任何东西,但是下面的代码运行得很好:
import System.Directory
main = getCurrentDirectory >>= \x -> doesFileExist x >>= print >> doesDirectoryExist x >>= print第一个代码没有打印任何东西的原因吗?
发布于 2021-06-09 01:48:21
如果在IO操作上执行fmap print,则不会得到执行此打印的IO操作。您只是获得了一个IO操作,该操作执行原始操作具有的任何副作用,但它不会生成可打印的值作为结果,而是生成另一个IO操作作为结果,然后您可以在单独的步骤中执行该操作:
import Control.Applicative
import Data.Time
printCurrentTime :: IO ()
printCurrentTime = do
tPrinter <- print <$> getCurrentTime
tPrinter或者,如果没有do表示法,
printCurrentTime = print <$> getCurrentTime >>= \tPrinter -> tPrinter换句话说,
printCurrentTime = print <$> getCurrentTime >>= id根据单子定律,f <$> a >>= b与a >>= b . f是相同的,即
printCurrentTime = getCurrentTime >>= id . print它与简单地
printCurrentTime = getCurrentTime >>= print它可以使用do表示法编写为
printCurrentTime = do
t <- getCurrentTime
print t发布于 2021-06-09 01:35:28
正如注释所述,您将获得一个IO (IO ())。我们可以使用join去掉重复的monad。
join (print <$> doesFileExist x)但是"fmap然后join“实际上就是>>=的定义(join和>>=可以相互定义)。这就是你的>>=能工作的原因。
https://stackoverflow.com/questions/67891911
复制相似问题