2012-02-05 53 views

回答

17

這是不可能的。 IO [[Int]]不包含包含[[Int]];它是一個命令式程序的描述,它執行IO時會產生[[Int]]類型的結果。這樣的描述根本不可能被執行或執行任何次數(每次產生一個[[Int]],而不一定是同一個)。

Haskell是一種純粹的語言,因此無法直接執行IO描述;相反,你可以將它們組合成更大的描述。要使IO實際發生,您可以將main定義爲IO操作,然後在程序運行時執行該操作;或者您可以在GHCi中輸入IO動作(如putStrLn "Hello, world!"),GHCi將運行它們。

構成IO操作的最簡單方法是使用do表示法,您可能已經使用了該表示法。這裏有一個例子:

myAction :: IO [[Int]] 
myAction = ... 

main :: IO() 
main = do 
    xs <- myAction 
    -- now xs is a normal value with type [[Int]] 
    print xs 

this FAQintroduction to IO以獲取更多信息。

+0

啊,很好,你擴大了你的答案,從而使我的答案大多是多餘的:-) – 2012-02-05 14:53:14

8

ehird的答案是正確的 - 類型IO [[Int]]的值是如何獲取整數列表的說明。這也被稱爲動作

要獲得[[Int]]您需要執行的操作。您可以使用do表示法中的<-運算符。這給你執行操作的結果,然後你可以根據需要操作這個值。不過,您仍然需要遲早將值返回到IO monad。在具體的代碼,它可以是這樣的:

sumAll :: IO [[Int]] -> IO Int 
sumAll io_lists = do 
    lists <- io_lists 
    return $ sum $ map sum lists 

這裏,lists勢必執行IO操作的結果。因此,您可以將sum映射到其上而不會造成任何問題。來自IO monad的return函數將valube「返回」到monad中,以便返回類型變爲IO Int。一些monad可以讓你從monad中獲取數值,但是IO不會 - 它代表副作用,並且你不能從代碼中移除副作用。