问题标签 [unsafe-perform-io]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1140 浏览

haskell - 在 randomIO 上使用 unsafeperformIO 的风险

我正在创建一个在无限循环上生成随机数的 Haskell 应用程序(仅在客户端请求时)。但是,我应该只为此目的使用纯函数。randomIOunsafeperformIO没有任何严重稳定性或性能风险的情况下进行包装是否安全?

0 投票
6 回答
4211 浏览

haskell - 在编译时或运行时生成一个随机字符串,并在程序的其余部分使用它

最好的方法是什么?unsafePerformIO? 模板 Haskell?还有什么?我从来没有使用过其中任何一个,所以我不知道使用它们的许多细节。

请注意,程序每次运行时都会被编译,所以我在编译时或运行时生成字符串都没有关系。我还需要在整个代码的很多地方使用这个字符串,所以我不能真正以“正确”的方式来做它,让它成为一个 IO 操作,这需要太多其他代码放入 IO monad .

0 投票
4 回答
7756 浏览

haskell - 我在滥用 unsafePerformIO 吗?

为了熟悉unsafePerformIO(如何使用它以及何时使用它),我实现了一个用于生成唯一值的模块。

这是我所拥有的:

令我高兴的是,名为的Data.Unique选择了与我相同的数据类型。另一方面,他们选择了 type ,但如果可能newUnique :: IO Unique的话,我想远离。IO

这种实施危险吗?它可能会导致 GHC 改变使用它的程序的语义吗?

0 投票
1 回答
271 浏览

haskell - 为什么我不能将值写入 IORef 但可以读取它

在 haskell 中,我需要一个全局变量,所以我选择使用 IORef 插槽,这是我的计划:

我的计划是当执行器评估“调用”节点时,它将参数保存到插槽中。然后,当评估“ARGs”节点时,将读取该备忘录槽。

但无论我做什么,我只能读取 9999 但不能将新值写入该插槽。

即使我尝试过:

它仍然会导致备忘录 = 9999。为什么?

0 投票
1 回答
186 浏览

haskell - 来自 FFI 和 unsafePerformIO 的不可变数据

我正在将 Haskell 绑定到图像加载库,并且我想尽可能避免复制。加载图像时,我从 C 库中取回包含图像数据的数据结构。现在,这个结构在所有意图和目的上都是不可变的,但是从它读取数据到 Haskell 是一个 IO 操作。是否可以使用 unsafePerformIO (或者可能是 unsafeDupablePerformIO 以获得更好的性能)来避免将内存复制到 Haskell 数组或类似数组中?当然,我需要将数据结构指针封装在 ForeignPtr 或类似内容中,并确保无法以任何其他方式访问或修改指针。

在这种情况下,惯例是什么?

0 投票
2 回答
204 浏览

haskell - 超时和 unsafePerformIO

我在 Haskell 中进行了一些练习,探索了一些我不熟悉的领域,但是我无法理解在混合System.TimeoutSystem.IO.Unsafe.

我懒惰地读取一个流,用getContents纯函数过滤它,然后输出结果。一个典型的过滤器是这样的:

使用这样的过滤器,程序会按预期读取所有标准输入,并输出到标准输出。但如果我这样做:

我希望我的程序立即超时,打印“超时!” 消息,然后关闭。相反,它挂在那里,等待输入。

我认为timeout在程序启动时评估该功能是错误的吗?我希望它是,因为我立即将它的部分返回值写入标准输出,并且每次我输入一行时软件都会做出反应。是否unsafePerformIO在我的函数中插入了某种惰性?还是将惰性插入到内部System.Timeout

0 投票
1 回答
198 浏览

haskell - 如何包装不安全的 FFI?(哈斯克尔)

这是对是否有充分的理由使用 unsafePerformIO 的后续问题?

所以我们知道

不安全,不能与unsafePerformIO.

但该p_sin函数仍然是一个数学函数,它以不安全的方式实现这一事实是一个实现细节。例如,我们并不完全希望矩阵乘法出现在 IO 中,因为它涉及分配临时内存。

我们如何以安全的方式包装这个函数?我们是否需要自己锁定、分配内存等?是否有处理此问题的指南/教程?

0 投票
3 回答
2126 浏览

haskell - (已编辑)如何在没有 IO 的情况下在 Haskell 中获取随机数

我想要一个stdGen在没有 IO 的情况下在每次调用中返回不同的函数。我尝试使用unsafePerformIO, 作为以下代码。

但是当我尝试调用myStdGenghci 时,我总是得到相同的值。我虐待了unsafePerformIO吗?或者还有其他方法可以达到我的目标吗?

编辑 对不起,我想我应该更准确地描述我的问题。

实际上,我正在实现一个变体的数据结构,它需要一个特殊的“合并”操作。它依赖于一些随机性来保证摊销的 O(log n) 预期时间复杂度。

我尝试使用一对like(Tree, StdGen)来为每个trap 保留随机生成器。在向 treap 插入新数据时,我会使用random随机值给新节点,然后更新我的生成器。但是我遇到了一个问题。我有一个调用函数empty,它将返回一个空的treap,我使用myStdGen上面的函数来获取这个treap 的随机生成器。但是,如果我有两个空的trep,它们StdGen将是相同的。因此,在我将数据插入到两个treap 之后,当我想合并它们时,它们的随机值也将是相同的。因此,我失去了我所依赖的随机性。

这就是为什么我想要一个“全局”随机生成器,它StdGen为每次调用产生不同的结果,这样每个空的treap 可以有不同的StdGen.

0 投票
1 回答
249 浏览

haskell - Haskell - 想要文件中的全局变量不会改变

我有这个函数可以构建一个映射来从一个不变的字典文件中查找字谜。我想将地图作为全局变量,因为它需要被其他函数使用。目前,这些函数在 buildAnagrams 上使用 unsafePerformIO,但我知道不建议这样做。整个程序也很慢,因为它要多次构建地图。必须有更好的方法来做到这一点?

0 投票
2 回答
150 浏览

haskell - 记忆一个有效的功能

我开始研究一个将元胞自动机定义为局部转换函数的项目:

无论何时g是 a Monoid,都可以通过在应用局部过渡之前转移焦点来定义全局过渡。这为我们提供了以下step功能:

现在,我们可以简单地使用iterate. memo我们可以通过调整每个步骤来节省很多(我的意思是很多:它确实节省了几个小时)的重新计算:

我的问题是我概括CellularCelluarT这样我就可以在本地规则中使用副作用(例如复制随机邻居):

但是,我只希望效果运行一次,这样如果您多次询问一个单元格的值是多少,答案都是一致的。memo在这里失败了,因为它保存了有效的计算而不是它的结果。

如果不使用不安全的功能,我不希望这是可以实现的。我尝试使用unsafePerformIO、 anIORef和 aMap g a来存储已经计算的值:

但它以不可预知的方式表现:memoM putStrLn被正确记忆,同时memoM (\ str -> getLine)继续获取行,尽管传递给它的参数相同。