gpt4 book ai didi

haskell - 是否有充分的理由使用 unsafePerformIO?

转载 作者:行者123 更新时间:2023-12-03 10:20:07 25 4
gpt4 key购买 nike

这个问题说明了一切。更具体地说,我正在编写与 C 库的绑定(bind),我想知道我可以使用哪些 c 函数 unsafePerformIO和。我假设使用 unsafePerformIO任何涉及指针的事情都是一个很大的禁忌。

很高兴看到可以使用 unsafePerformIO 的其他情况也。

最佳答案

此处无需涉及 C。 unsafePerformIO功能可以在任何情况下使用,

  • 你知道它的使用是安全的,
  • 您无法使用 Haskell 类型系统证明其安全性。

  • 例如,您可以使用 unsafePerformIO 创建一个 memoize 函数。 :
    memoize :: Ord a => (a -> b) -> a -> b
    memoize f = unsafePerformIO $ do
    memo <- newMVar $ Map.empty
    return $ \x -> unsafePerformIO $ modifyMVar memo $ \memov ->
    return $ case Map.lookup x memov of
    Just y -> (memov, y)
    Nothing -> let y = f x
    in (Map.insert x y memov, y)

    (这不是我的想法,所以我不知道代码中是否存在明显的错误。)

    memoize 函数使用并修改了一个 memoization 字典,但由于函数作为一个整体是安全的,你可以给它一个纯类型(不使用 IO monad)。但是,您必须使用 unsafePerformIO要做到这一点。

    脚注:对于 FFI,您负责向 Haskell 系统提供 C 函数的类型。可以达到 unsafePerformIO的效果通过简单地省略 IO从类型。 FFI 系统本质上是不安全的,所以使用 unsafePerformIO没什么区别。

    脚注2:使用 unsafePerformIO 的代码中通常存在非常细微的错误。 ,这个例子只是一个可能用途的草图。特别是, unsafePerformIO与优化器的交互可能很差。

    关于haskell - 是否有充分的理由使用 unsafePerformIO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10529284/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com