Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔:如何将IO(a)转换为a?_Haskell - Fatal编程技术网

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
是一个“坏主意”)。衷心感谢您的及时回答!