gpt4 book ai didi

haskell - 记录更新的内部行为如何?

转载 作者:行者123 更新时间:2023-12-02 06:15:34 25 4
gpt4 key购买 nike

data Thing = Thing {a :: Int, b :: Int, c :: Int, (...) , z :: Int} deriving Show

foo = Thing 1 2 3 4 5 (...) 26
mkBar x = x { c = 30 }

main = do print $ mkBar foo

当我以这种方式改变 foo 时,会复制什么?与直接改变结构的一部分相反。

Data Thing = Thing {a :: IORef Int, b :: IORef Int, (...) , z :: IORef Int}
instance Show Thing where
(...something something unsafePerformIO...)

mkFoo = do a <- newIORef 1
(...)
z <- newIORef 26
return Thing a b (...) z
mkBar x = writeIORef (c x) 30

main = do foo <- mkFoo
mkBar foo
print foo

优化编译会改变这种行为吗?

最佳答案

在第一个示例中,复制指向未更改的 Int 组件的指针(如果您愿意的话,还复制构造函数标记)。无论是复制 Int 还是指向 Int 的指针,都没有太大区别,但如果组件是大型结构,那就会有太大区别。

由于字段不严格,因此该行为与优化无关。如果字段是严格的,并且经过优化,它们可能会被解包到构造函数中,然后复制原始的 Int# 值。

在第二个示例中,没有复制任何内容,IORef 的内容被覆盖。

关于haskell - 记录更新的内部行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328928/

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