2013-05-27 76 views
3

我有一個函數返回我IO (Map.Map String Double),我需要Map.Map String Double,沒有IO。Haskell:如何將IO(a)轉換爲?

我試圖做到這一點,但它失敗:不在範圍內:數據構造函數`IO'。

extractIO (IO (a)) = a 
+5

通常情況下,你無法擺脫'IO'。 (如果你絕對必須的話,有一種方法。)'IO'將純粹的東西從需要與外部交互的污染中分離出來,比如讀取文件或獲取用戶輸入。你可以將結果綁定到一個名字'theMap < - thingThatCreatesMap',並將其用於從'IO'-動作調用的純粹計算中。 –

+1

另請參閱'fmap',它可讓您將函數應用於'IO'包裝的值。當你將'fmap'專門化爲'IO'時,它的類型爲:'(a - > b) - > IO a - > IO b'。 –

+1

這個想法是,你不會得到* IO *的東西*。相反,您使用Monad功能將*推入*'IO',在那裏您可以安全地將它們與需要在IO中的值組合(例如,'fmap'可以將常規函數'a - > b'轉換爲函數'IO a - > IO b',然後您可以將其應用於您的'IO a'值)。 – Ben

回答

12

你不能只是展開IO,這就是IO的整個點。

如果你有一個IO(Map.Map字符串雙人間),並要處理那件事,你要一元範圍內做到這一點,即

stuff :: IO() 
stuff = do 
    map <- theThingThatReturnsYourIOMap 
    theThingThatNeedsYourUnwrappedMap map 

如果你想要什麼更詳細的解釋要做的,我們可以給你一個更詳細的答案。

+0

真誠感謝您的及時答覆! –

1
+0

更好的鏈接是http://hackage.haskell.org/packages/archive/base/4.6.0.1/doc/html/System-IO-Unsafe.html#v:unsafePerformIO – leventov

+9

這是不是一個好主意,直​​接給這個回答。 'unsafePerformIO'是一個後門(專爲特殊目的而創建),不應該教給仍然學習Haskell的人。相反,他們應該學會使用Haskell的精神。 – is7s

+3

儘管我同意這不是一個好的答案,但它仍然是一個有效的答案,並且在給出必要的警告(儘管它應該可能已經解釋_why_' unsafePerformIO'是「一個壞主意」)時立即給出了。 – leftaroundabout