Haskell:用IO [FilePath]得不到这个

use*_*127 4 io haskell

在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?

任何反馈或愚蠢的赞美.

Tho*_*son 9

要获取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)


ham*_*mar 5

用于<-记号来达到[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用户指南.