在ghci中学习教程等 - 到目前为止一切顺利.我完全错过了一些东西:我的功能构建了一个IO [FilePath]
"东西".在ghci它出来像这样:
["xml","velocity.log.1","velocity.log"]
(为简洁起见,列表被截断)
我看到功能正在做我想要的.下一步是我想自己"打印"出来.
我没做什么让我打印结果.我不想在Haskell中延续我的Java/C#/ Python习惯 - 没有任何意义.我相信Haskell以不同的方式做事是有充分理由的,但是我看不出如何从这个函数中获取(有限的)值.
module Main (
main
) where
import RecursiveContents
main = do putStrLn "this"
getRecursiveContents "/home/xyz/myDir"
Run Code Online (Sandbox Code Playgroud)
这有效.但是如果我想要main打印结果getRecursiveContents "/home/xyz/myDir"
怎么办?
在ghci我可以输入/粘贴getRecursiveContents "/home/xyz/myDir"
,然后喷出的东西 - 我自己要做什么来打印?
如果我做 :
let xyz = getRecursiveContents "/home/xyz/myDir"
在ghci中,我唯一能做的xyz
就是键入:
xyz <enter>
并查看结果.
我不能做头,尾等等.我知道这IO [FilePath]
是特别的,而不是数组或列表相同[a]
- 但我没有做的是帮助我理解过去.
我一定错过了一些东西 - 在" 了解你是哈斯克尔 "或" 真实世界哈斯克尔"中找不到的东西.我不是在正确的地方rtf?
任何反馈或愚蠢的赞美.
要获取IO操作的结果(即运行操作),请将计算结果绑定IO
到变量:
假设:
getRecursiveContents :: FilePath -> IO String
Run Code Online (Sandbox Code Playgroud)
然后你可以打印结果:
main = do str <- getRecursiveContents "/home/xyz/myDir"
print str
Run Code Online (Sandbox Code Playgroud)
显然这只是一个例子,但是当函数真的只有两行时,人们通常不会使用do
符号并避免显式命名中间变量str
:
main = getRecursiveContents "/home/xyz/myDir" >>= print
Run Code Online (Sandbox Code Playgroud)
用于<-
记号来达到[FilePath]
.然后,您可以使用任何列表函数对其进行操作,只要您最终执行某些IO
操作即可.
main = do putStrLn "this"
contents <- getRecursiveContents "/home/xyz/myDir"
print contents
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用>>=
将一个IO
动作的输出提供给另一个动作.这是一回事,只是写得不一样.
main = do putStrLn "this"
getRecursiveContents "/home/xyz/myDir" >>= print
Run Code Online (Sandbox Code Playgroud)
有关更详细的说明,请参阅I/O章节
它在GHCi中工作的原因是,当GHCi评估你的表达式时,它会查看类型.如果是IO a
,它将运行动作并自动显示结果,而在真实程序中,您必须自己执行此操作.请参阅GHC用户指南.