我有一個函數返回我IO (Map.Map String Double)
,我需要Map.Map String Double
,沒有IO。Haskell:如何將IO(a)轉換爲?
我試圖做到這一點,但它失敗:不在範圍內:數據構造函數`IO'。
extractIO (IO (a)) = a
我有一個函數返回我IO (Map.Map String Double)
,我需要Map.Map String Double
,沒有IO。Haskell:如何將IO(a)轉換爲?
我試圖做到這一點,但它失敗:不在範圍內:數據構造函數`IO'。
extractIO (IO (a)) = a
你不能只是展開IO,這就是IO的整個點。
如果你有一個IO(Map.Map字符串雙人間),並要處理那件事,你要一元範圍內做到這一點,即
stuff :: IO()
stuff = do
map <- theThingThatReturnsYourIOMap
theThingThatNeedsYourUnwrappedMap map
如果你想要什麼更詳細的解釋要做的,我們可以給你一個更詳細的答案。
真誠感謝您的及時答覆! –
更好的鏈接是http://hackage.haskell.org/packages/archive/base/4.6.0.1/doc/html/System-IO-Unsafe.html#v:unsafePerformIO – leventov
這是不是一個好主意,直接給這個回答。 'unsafePerformIO'是一個後門(專爲特殊目的而創建),不應該教給仍然學習Haskell的人。相反,他們應該學會使用Haskell的精神。 – is7s
儘管我同意這不是一個好的答案,但它仍然是一個有效的答案,並且在給出必要的警告(儘管它應該可能已經解釋_why_' unsafePerformIO'是「一個壞主意」)時立即給出了。 – leftaroundabout
通常情況下,你無法擺脫'IO'。 (如果你絕對必須的話,有一種方法。)'IO'將純粹的東西從需要與外部交互的污染中分離出來,比如讀取文件或獲取用戶輸入。你可以將結果綁定到一個名字'theMap < - thingThatCreatesMap',並將其用於從'IO'-動作調用的純粹計算中。 –
另請參閱'fmap',它可讓您將函數應用於'IO'包裝的值。當你將'fmap'專門化爲'IO'時,它的類型爲:'(a - > b) - > IO a - > IO b'。 –
這個想法是,你不會得到* IO *的東西*。相反,您使用Monad功能將*推入*'IO',在那裏您可以安全地將它們與需要在IO中的值組合(例如,'fmap'可以將常規函數'a - > b'轉換爲函數'IO a - > IO b',然後您可以將其應用於您的'IO a'值)。 – Ben