我有一个返回值为 IO (Map.Map String Double)
的函数,我需要的是一个不带 IO 的 Map.Map String Double
。
我尝试了下面这个方法,但是出现了错误:Not in scope: data constructor `IO'。
extractIO (IO (a)) = a
我有一个返回值为 IO (Map.Map String Double)
的函数,我需要的是一个不带 IO 的 Map.Map String Double
。
我尝试了下面这个方法,但是出现了错误:Not in scope: data constructor `IO'。
extractIO (IO (a)) = a
你不能仅仅取消IO,这就是IO的全部意义。
如果你有一个IO (Map.Map String Double)对象并想要处理它,你必须在单子上下文中进行处理,也就是说:
stuff :: IO ()
stuff = do
map <- theThingThatReturnsYourIOMap
theThingThatNeedsYourUnwrappedMap map
如果您能更详细地解释您想要做什么,我们可以给您提供更详细的答案。
unsafePerformIO
是一种后门(专门为特殊目的而创建的),不应该教给尚在学习Haskell的人。相反,他们应该学习如何在Haskell的精神中使用它。 - is7sunsafePerformIO
是“不好的想法”)。 - leftaroundabout
IO
。(如果非常必要,有一种方法可以做到。)IO
将纯部分与需要与外部进行交互的“受污染”部分(例如读取文件或获取用户输入)分开。您可以将结果绑定到一个名称上,例如theMap <- thingThatCreatesMap
,并在从IO
操作调用的纯计算中使用它。 - Daniel Fischerfmap
函数,它可以让你对IO
包装的值应用一个函数。当你将fmap
函数特化为IO
时,它的类型为:(a -> b) -> IO a -> IO b
。 - Gabriella GonzalezIO
中获取东西。相反,你使用 Monad 特性将东西推入IO
中,在那里你可以安全地将它们与必须在IO
中的值组合(例如,fmap
可以将普通函数a -> b
转换为函数IO a -> IO b
,然后你可以将其应用于你的IO a
值)。 - Ben