Haskell 哈斯克尔:如何将IO(a)转换为a?
我有一个函数返回我Haskell 哈斯克尔:如何将IO(a)转换为a?,haskell,Haskell,我有一个函数返回我IO(Map.Map String Double),我需要Map.Map String Double,不带IO 我尝试这样做,但失败的原因是:不在范围内:数据构造函数'IO' extractIO (IO (a)) = a 你不能只是打开IO,这就是IO的全部意义 如果您有一个IO(Map.Map String Double)并且您想要处理这个东西,那么您必须在一元上下文中进行处理,即 stuff :: IO () stuff = do map <- theThing
IO(Map.Map String Double)
,我需要Map.Map String Double
,不带IO
我尝试这样做,但失败的原因是:不在范围内:数据构造函数'IO'
extractIO (IO (a)) = a
你不能只是打开IO,这就是IO的全部意义 如果您有一个IO(Map.Map String Double)并且您想要处理这个东西,那么您必须在一元上下文中进行处理,即
stuff :: IO ()
stuff = do
map <- theThingThatReturnsYourIOMap
theThingThatNeedsYourUnwrappedMap map
stuff::IO()
做某事
地图
不安全
但这是一个坏主意。一般来说,你不能离开IO
,这是故意的。(如果你一定要这样做,有一种方法。)IO
将纯物质与需要与外部交互(如读取文件或获取用户输入)的污染物质区分开来。您可以将结果绑定到一个名称,theMap另请参见fmap
,该名称允许您对IO
包装的值应用函数。当您将fmap
专门化为IO
时,它的类型为:(a->b)->ioa->iob
。其思想是您不会从IO
中获得任何东西。相反,您可以使用Monad功能将内容推入IO
,在那里您可以安全地将它们与IO
中所需的值组合在一起(例如fmap
可以将正常函数a->b
转换为函数ioa->iob
,然后您可以将其应用于ioa
值).更好的链接是直接给出这个答案并不是一个好主意unsafePerformIO
是一个后门(为特殊目的而创建),不应该教给仍在学习Haskell的人。相反,他们应该学会按照Haskell的精神来使用它。虽然我同意这不是一个好的答案,但它仍然是一个有效的答案,并且立即给出了必要的警告(尽管它也许应该解释为什么unsafePerformIO
是一个“坏主意”)。衷心感谢您的及时回答!