相关疑难解决方法(0)

Haskell数据类型的内存占用量

如何找到在Haskell中存储某些数据类型值所需的实际内存量(主要是使用GHC)?是否可以在运行时(例如在GHCi中)对其进行评估,还是可以从其组件中估算复合数据类型的内存要求?

在一般情况下,如果类型的存储需求ab已知的,什么是代数数据类型,如内存开销:

data Uno = Uno a
data Due = Due a b
Run Code Online (Sandbox Code Playgroud)

例如,这些值占用的内存中有多少字节?

1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Run Code Online (Sandbox Code Playgroud)

据我所知,由于垃圾收集延迟,实际的内存分配更高.由于惰性评估,它可能会有很大的不同(并且thunk大小与值的大小无关).问题是,给定数据类型,在完全评估时它的值会占用多少内存?

我发现:set +sGHCi中有一个选项可以查看内存统计信息,但目前尚不清楚如何估算单个值的内存占用量.

haskell memory-management ghc algebraic-data-types

120
推荐指数
2
解决办法
6992
查看次数

如何确定Haskell中类型的大小?

假设我创建了一个类型如下:

data RequestAck = 
         RequestAck { ackOK :: Word32, ackMsgCode :: Word32 } 
Run Code Online (Sandbox Code Playgroud)

我可以看到它是2*4字节大,并使其在某处保持不变.

唯一的问题是,一旦我在类型中添加了一个字段,我就必须记得更新我的常量.

是否有一个功能可以为我提供给定类型的大小,例如t -> Int

接近我想要的功能是

gsize :: Data a => a -> Int

在Data.Generics.Schemes模块中,但我不想让我的类型成为一个实例Data.

那里有更通用的解决方案吗?

可以肯定的是,我正在寻找一个对静态类型进行操作的函数,例如,我不想传递实例,而是传递类型本身.

byte haskell types

14
推荐指数
1
解决办法
2060
查看次数

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

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

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

使用unsafeSizeof(从这个答案中窃取)的实验让我相信它可以是零内存开销:

? p = (0, '\0') :: (Int, Char)
? q = Uncurry p
? unsafeSizeof p
10
? unsafeSizeof q
10
Run Code Online (Sandbox Code Playgroud)

所以它看起来像是Uncurry一种表现形式,newtype仅在编译时使用.

这对我来说很有意义,因为平等断言不需要提供字典.

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

haskell existential-type strictness

5
推荐指数
2
解决办法
123
查看次数