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