Haskell:使用对变量的最后引用来有效创建新变量

骨质疏松症

从概念上讲,此C代码可以描述为创建一个与输入数组相同的新数组,但第一个元素为1:

int* retire_and_update(int* arr) {
    arr[0] = 1;
    return arr;
}

只要没有对输入数组及其元素的进一步引用,这就是一个纯函数(眨眼眨眼轻推微动)。C类型系统不会对我们强制执行该操作,但原则上它似乎可以执行。

gcc生成的代码既简单又有效:

retire_and_update:
    movq    %rdi, %rax
    movl    $1, (%rdi)
    ret

我们的函数通过在恒定时间内创建一个全新的数组并且不使用额外的内存来实现看似不可能的事情。好的。是否可以编写具有类似数组的输入和输出的Haskell函数,并可以用类似的代码有效地实现它?有没有一种表达“这是对该变量的最后引用”的方法,以便纯函数可以在后台蚕食该变量?

如果函数被内联,则这里不需要发生任何有趣的事情,因此,假设调用者和函数将分别编译。

贝扎德·诺里

尽管ST monad并不是您所描述的,但实际上您可以使用实现大多数功能STUArray因此,模拟您的代码可能类似于:

import Control.Monad (forM_)
import Control.Monad.ST (ST)
import Data.Array.Unboxed (UArray)
import Data.Array.ST (STUArray, newArray, readArray, writeArray, runSTUArray)

retire_and_update :: STUArray s Int Int -> ST s (STUArray s Int Int)
retire_and_update arr = do
    writeArray arr 0 1
    return arr

并且如果您还有另一个函数可以就地改变数组,例如:

mutate_inplace :: STUArray s Int Int -> Int -> ST s ()
mutate_inplace arr size = do
    forM_ [2..size - 1] $ \i -> do
        a <- readArray arr (i - 2)
        b <- readArray arr (i - 1)
        writeArray arr i (a + b)

您可以两个不纯函数绑定在一起,并使用以下命令在纯函数中调用它们runSTUArray

run :: Int -> UArray Int Int
run size = runSTUArray $ do
    arr <- newArray (0, size - 1) 0
    retire_and_update arr
    mutate_inplace arr size
    return arr

请注意,它run保持纯净,并且返回的数组的早期版本不会在任何地方泄漏出去

\> run 8
array (0,7) [(0,1),(1,0),(2,1),(3,1),(4,2),(5,3),(6,5),(7,8)]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用来自另一个data.table的引用创建新变量

来自分类Dev

有没有更有效的方法在for循环中创建新变量?

来自分类Dev

从临时变量返回的引用是否有效?

来自分类Dev

Haskell,函数在使用数字时有效,但不适用于变量

来自分类Dev

Haskell,函数在使用数字时有效,但不适用于变量

来自分类Dev

内部类引用的局部变量必须是最终变量或有效最终变量

来自分类Dev

使用docplex python API添加新变量的有效方法是什么?

来自分类Dev

变量有效与否

来自分类Dev

在python中创建虚拟变量的有效方法

来自分类Dev

在R中创建等级变量的有效方法

来自分类Dev

创建变量而不是在输出中使用运算是否更快(或更有效)?

来自分类Dev

如何使用Stata有效地创建滞后变量

来自分类Dev

选中复选框时有效地创建变量,并在稍后的代码中使用这些变量

来自分类Dev

是否可以使用Ruby或Python禁用锚/引用来发出有效的YAML?

来自分类Dev

通过引用将变量传递给函数是否比使函数返回变量更有效?

来自分类Dev

使用显式变量是否更有效?

来自分类Dev

在POST有效负载中使用环境变量

来自分类Dev

惰性属性-有效使用可变变量吗?

来自分类Dev

使用Python有效地遍历对象变量

来自分类Dev

为元素创建变量或每次选择变量是否更有效?

来自分类Dev

有效创建可观察变量,以从可观察变量集中过滤特定项目

来自分类Dev

如何有效地根据其他索引变量上的条件创建变量?

来自分类Dev

使用现有变量组创建新的SAS变量组

来自分类Dev

有什么更有效的?存储变量引用与不存储(Android中的上下文)

来自分类Dev

C ++ | 只有引用变量在功能模板中有效

来自分类Dev

PostgreSQL:有效的变量分配示例?

来自分类Dev

如何有效表达SED变量?

来自分类Dev

从lambda表达式引用的局部变量必须是final或有效的final

来自分类Dev

为什么在Perl中为数组变量分配列表引用有效?

Related 相关文章

  1. 1

    使用来自另一个data.table的引用创建新变量

  2. 2

    有没有更有效的方法在for循环中创建新变量?

  3. 3

    从临时变量返回的引用是否有效?

  4. 4

    Haskell,函数在使用数字时有效,但不适用于变量

  5. 5

    Haskell,函数在使用数字时有效,但不适用于变量

  6. 6

    内部类引用的局部变量必须是最终变量或有效最终变量

  7. 7

    使用docplex python API添加新变量的有效方法是什么?

  8. 8

    变量有效与否

  9. 9

    在python中创建虚拟变量的有效方法

  10. 10

    在R中创建等级变量的有效方法

  11. 11

    创建变量而不是在输出中使用运算是否更快(或更有效)?

  12. 12

    如何使用Stata有效地创建滞后变量

  13. 13

    选中复选框时有效地创建变量,并在稍后的代码中使用这些变量

  14. 14

    是否可以使用Ruby或Python禁用锚/引用来发出有效的YAML?

  15. 15

    通过引用将变量传递给函数是否比使函数返回变量更有效?

  16. 16

    使用显式变量是否更有效?

  17. 17

    在POST有效负载中使用环境变量

  18. 18

    惰性属性-有效使用可变变量吗?

  19. 19

    使用Python有效地遍历对象变量

  20. 20

    为元素创建变量或每次选择变量是否更有效?

  21. 21

    有效创建可观察变量,以从可观察变量集中过滤特定项目

  22. 22

    如何有效地根据其他索引变量上的条件创建变量?

  23. 23

    使用现有变量组创建新的SAS变量组

  24. 24

    有什么更有效的?存储变量引用与不存储(Android中的上下文)

  25. 25

    C ++ | 只有引用变量在功能模板中有效

  26. 26

    PostgreSQL:有效的变量分配示例?

  27. 27

    如何有效表达SED变量?

  28. 28

    从lambda表达式引用的局部变量必须是final或有效的final

  29. 29

    为什么在Perl中为数组变量分配列表引用有效?

热门标签

归档