2011-05-15 65 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