gpt4 book ai didi

haskell - 具有单个严格字段的​​存在数据类型

转载 作者:行者123 更新时间:2023-12-02 12:10:11 26 4
gpt4 key购买 nike

所以我有一个带有单个严格字段的​​存在数据类型:

data Uncurry (a :: i -> j -> *) (z :: (i,j)) =
forall x y. z ~ '(x,y) => Uncurry !(a x y)

使用 unsafeSizeof (从 this answer 窃取)的实验让我相信它可以是零内存开销:

λ p = (0, '\0') :: (Int, Char)
λ q = Uncurry p
λ unsafeSizeof p
10
λ unsafeSizeof q
10

所以看起来Uncurry有点像newtype,仅在编译时使用。

这对我来说很有意义,因为相等断言不需要携带字典。

这是一个有效的解释吗? GHC(或 Haskell 报告)对此有任何保证吗?还是我只是运气好?

最佳答案

data 永远不会转换为 newtype。从 GHC 8.0.2 开始,Uncurry 确实添加了一个新的闭包,并且实际上也添加了 ~ 字典的指针。因此,Uncurry 有一个包含三个单词的闭包。

unsafeSizeof 不正确,因为 Array# 以字为单位存储其大小,而 ByteArray# 以字节为单位存储其大小,因此 sizeofByteArray# (unsafeCoerce# ptrs) 返回字数而不是预期的字节数。在 64 位系统上,正确的版本应如下所示:

unsafeSizeof :: a -> Int
unsafeSizeof !a =
case unpackClosure# a of
(# x, ptrs, nptrs #) ->
I# (8# +# sizeofArray# nptrs *# 8# +# sizeofByteArray# ptrs)

但请注意,unsafeSizeof 只提供了最顶层闭包的大小。因此,任何装箱元组的闭包大小将为 24,这与 Uncurry t 的闭包大小一致,因为 Uncurry 有一个信息指针,~ 的无用指针,以及元组字段的指针。这种巧合也适用于之前有缺陷的 unsafeSizeof 实现。但Uncurry t 的总大小大于t

关于haskell - 具有单个严格字段的​​存在数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46300021/

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