Haskell 在打印上应用函子

Haskell 在打印上应用函子,haskell,functor,Haskell,Functor,我一直在尝试分别打印2个值,我尝试了以下代码: 导入系统目录 main=getCurrentDirectory>>=\x->(打印doesFileExist x)>>(打印doesDirectoryExist x) 但它不会打印任何内容,但以下代码可以正常工作: 导入系统目录 main=getCurrentDirectory>>=\x->doesFileExist x>>=print>>doesDirectoryExist x>>=print 第一个代码没有打印任何内容的原因是什么?如注释所

我一直在尝试分别打印2个值,我尝试了以下代码:

导入系统目录
main=getCurrentDirectory>>=\x->(打印doesFileExist x)>>(打印doesDirectoryExist x)
但它不会打印任何内容,但以下代码可以正常工作:

导入系统目录
main=getCurrentDirectory>>=\x->doesFileExist x>>=print>>doesDirectoryExist x>>=print

第一个代码没有打印任何内容的原因是什么?

如注释所述,您会得到一个
IO(IO())
。我们可以用它来消除重复的单子

join (print <$> doesFileExist x)
join(打印doesFileExist)

但是“
fmap
然后
join
”是
>=
的字面定义(
join
>=
可以相互定义)。这就是你的
>=
工作的原因。

在你使用函子映射的第一项中,你为

print <$> doesFileExist x :: IO (IO ())

由于这将对
doesFileExist
的结果起作用,并对
IO()
求值,在那里它将打印
Bool
ean。

如果对IO操作执行fmap
print
,则不会得到执行此打印的
IO
操作。您只需要得到一个IO操作,该操作执行原始操作所具有的任何副作用,但结果不是生成可打印的值,而是生成另一个
IO
操作,然后您可以在单独的步骤中执行该操作:

import Control.Applicative
import Data.Time

printCurrentTime :: IO ()
printCurrentTime = do
   tPrinter <- print <$> getCurrentTime
   tPrinter
换句话说,

printCurrentTime = print <$> getCurrentTime >>= id
这与简单的

printCurrentTime = getCurrentTime >>= print
这可以用
do
符号写成

printCurrentTime = do
   t <- getCurrentTime
   print t
printCurrentTime=do

在第一个使用函子映射的项目中,您因此为
print doesfilex
创建了一个
IO(IO())
,而不是
IO()
。我是来宣传
print的=
printCurrentTime = getCurrentTime >>= id . print
printCurrentTime = getCurrentTime >>= print
printCurrentTime = do
   t <- getCurrentTime
   print t