可能重複:
Convert Haskell IO list to list type如何在Haskell中將IO [[Int]]轉換爲[[Int]]?
我試圖尋找,但似乎並沒有找到合適的答案,這可能擺在首位?任何幫助,在此表示讚賞。
可能重複:
Convert Haskell IO list to list type如何在Haskell中將IO [[Int]]轉換爲[[Int]]?
我試圖尋找,但似乎並沒有找到合適的答案,這可能擺在首位?任何幫助,在此表示讚賞。
這是不可能的。 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 FAQ和introduction to IO以獲取更多信息。
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不會 - 它代表副作用,並且你不能從代碼中移除副作用。
啊,很好,你擴大了你的答案,從而使我的答案大多是多餘的:-) – 2012-02-05 14:53:14