46得票8回答
Haskell真的是一种纯函数式语言吗?考虑到unsafePerformIO?

Haskell通常被引用为纯函数式语言的典范。鉴于存在System.IO.Unsafe.unsafePerformIO,这该如何证明? 编辑:我原以为“纯函数式”意味着不可能将不纯的代码引入程序的函数式部分。

26得票4回答
我是否滥用了unsafePerformIO?

为了熟悉 unsafePerformIO(如何使用以及何时使用它),我已经实现了一个用于生成唯一值的模块。 这是我所拥有的:module Unique (newUnique) where import Data.IORef import System.IO.Unsafe (unsafePe...

21得票1回答
unsafeDupablePerformIO和accursedUnutterablePerformIO有什么区别?

我在 Haskell 图书馆的受限区域里徘徊,发现了这两个邪恶的咒语:{- System.IO.Unsafe -} unsafeDupablePerformIO :: IO a -> a unsafeDupablePerformIO (IO m) = case runRW# m of ...

19得票5回答
避免常见的unsafePerformIO使用方法

我经常在 Haskell 代码中看到这种模式:options :: MVar OptionRecord options = unsafePerformIO $ newEmptyMVar ... doSomething :: Foo -> Bar doSomething = unsaf...

13得票2回答
unsafePerformIO和FFI库初始化

我正在创建一个FFI模块,连接到一个在C中的库,该库要求调用一个一次性、不可重入的函数,在任何其他操作之前。这个调用是幂等的,但具有状态,因此我可以在每个Haskell调用中都调用它。但是这样做很慢,并且由于不可重入性可能会导致冲突。 那么现在是使用unsafePerformIO的正确时间吗?...

10得票6回答
在编译时或运行时生成一个随机字符串,并在程序的其余部分使用它。

什么是最好的方法来做到这一点?使用unsafePerformIO?模板Haskell?还是其他什么?我从未使用过其中任何一个,所以不了解它们的详细信息。 请注意,每次运行程序时都将编译该程序,因此在编译时或运行时生成字符串并无影响。我还需要在代码的许多地方使用此字符串,因此我不能按照“正常”...

8得票2回答
IO类型展示

我有一个数据类型,其中包含IORef作为一个重要元素。这意味着没有一种简单的方法将其作为show类型类的成员。对于这种类型,我在IO单子中有一个print函数,所以这不算太糟糕。但是,在GHCi中,每次我返回这些内容作为结果时,都会出现错误,指出它无法显示。 是否有一种方法可以让在IO单子中...

7得票3回答
如何编写一个没有IO类型签名的Haskell函数,通过隐藏“状态”更改来实现。

我在Haskell中编写了一个函数,它接受一些参数,如Word32、String(忽略柯里化),并输出IO Word32。现在,这是一个真正意义上的函数:对于相同的输入,输出将始终相同。没有副作用。该函数返回IO Word32而不是Word32的原因是,在循环中,该函数更新许多32位线性反馈移...

7得票2回答
如何知道一个看起来纯粹的 Haskell 接口隐藏了不安全的操作?

我最近一直在阅读关于unsafePerformIO的内容,想问你一些问题。我知道一个真正的语言应该能够与外部环境交互,所以unsafePerformIO有一定合理性。 然而,据我所知,除了检查代码以寻找对unsafePerformIO的调用(文档可能省略提及),我不知道是否有任何快速的方法可...