2011-05-15 32 views
3

通过教程等在ghci - 迄今如此好。我完全错过了一些东西:我的函数构建了一个IO [FilePath]“事物”。在ghci中它出来是这样的:Haskell:没有得到这与IO [FilePath]

["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" 

This works。但是如果我想主要打印getRecursiveContents "/home/xyz/myDir"的结果呢?

在ghci中,我只需键入/粘贴getRecursiveContents "/home/xyz/myDir",并且东西被喷出 - 我必须自己打印什么?

如果我做的:在ghci中

let xyz = getRecursiveContents "/home/xyz/myDir",我可以xyz唯一能做的就是类型: xyz <enter>和看到的结果。

我不能做头部,尾巴等等。我知道IO [FilePath]是一些特别的东西,不像数组或列表[a] - 但我没有做的是帮助我理解这个过去。

我一定会错过一些东西 - 我在Learn You a HaskellReal World Haskell中找不到。我不是在正确的地方嬉戏吗?

赞赏任何反馈或涂料板。

回答

8

为了得到一个IO动作的结果(即运行的操作),你绑定的的IO计算的结果给一个变量:

假设:

getRecursiveContents :: FilePath -> IO String 

那么你可以只打印结果:

main = do str <- getRecursiveContents "/home/xyz/myDir" 
      print str 

显然这只是一个例子,但是当函数真的只是两个行人们不经常使用do符号,避免明确命名的str中间变量:

main = getRecursiveContents "/home/xyz/myDir" >>= print 
+0

感谢您的快速回复 - 我错过了所有重要的“< - ” – user192127 2011-05-15 04:24:05

4

你可以做块绑定值。这也是在那里你可以(像表演,尾巴等)应用纯函数的地方:

main = do putStrLn "this" 
      x <- getRecursiveContents "/home/xyz/myDir" 
      putStrLn (show x) 

如果的类型是IO的,那么你需要像做和X < - 富来获取值。

查阅任何monad教程以获取更多信息。

+0

感谢您的快速回复 - 我错过了最重要的“< - ” – user192127 2011-05-15 04:22:52

5

使用<-中的符号去[FilePath]。然后,您可以使用任何列表功能对其进行操作,只要您结束一些IO操作即可。

main = do putStrLn "this" 
      contents <- getRecursiveContents "/home/xyz/myDir" 
      print contents 

或者,您可以使用>>=一个IO动作的输出送入另一个。这是一样的,只是写法不同而已。

main = do putStrLn "this" 
      getRecursiveContents "/home/xyz/myDir" >>= print 

有关更详尽的解释,看到的


为什么它工作在GHCI究其原因,I/O的章节,是当GHCi评估你的表情时,它会查看类型。如果它是IO a,它将自动运行并显示结果,而在真正的程序中,您必须自己执行此操作。请参阅GHC user's guide

+0

感谢您的快速回复 - 我错过了所有-important“< - ” – user192127 2011-05-15 04:22:27

+1

@user ...你会注意到其中的一个实际上并没有使用'<-' – tobyodavies 2011-05-15 04:57:19