Haskell中提升和未提升的产品类型是什么?

jml*_*jml 12 haskell types

我最近最近遇到了"提升产品类型"一词,与未提升产品类型形成鲜明对比.

我不记得上下文,但我发现Stack Overflow还有其他问题,询问未提升产品类型的缺点(例子).

我或多或少知道什么是产品类型.它类似于(a, b)Foo a b c大致对应于集合论中的笛卡尔积.

在这种情况下,"解除"和"解除"这两个词的含义是什么?

Ale*_*lec 10

来自GHC文档:

"提升"类型意味着该类型的术语可能是底部.

"boxed"类型表示值由指向堆对象的指针表示.

一些影响包括:

  • 装箱的类型是装箱的(但不一定是另一种方式 - 请查看上面的链接以获取更多信息)
  • 未装箱的类型不能有thunk(因为那些指向数据的指针告诉你如何产生值),所以没有懒惰.他们真的只是持有价值观.这也意味着它们可以更快.
  • 多态性不适用于未提升的类型.每当您看到一个类型变量时,所有涉及的类型都会被解除.有点像id 0 :: Int#不起作用.看看这个答案,看看你怎么能(因为GHC 8.0)有时会在这周围进行操作.

请注意,您可以使用MagicHashUnboxedTuples扩展在GHC中创建未提升的产品(尽管我认为它们不适合GHCi):

{-# LANGUAGE MagicHash, UnboxedTuples #-}

extGCD :: Int -> Int -> (# Int, Int, Int #)
extGCD a 0 = (# 1, 0, a #)
extGCD a b = let (q, r) = a `quotRem` b
                 (# s, t, g #) = extGCD b r
             in  (# t, s - q * t, abs g #)
Run Code Online (Sandbox Code Playgroud)

有了这个扩展之外,我相信只有未提升的类型,你会发现在GHC.Exts和是原始类型.有一些讨论,允许自定义未提升的数据类型集成到GHC 这里.

最后一句话:虽然提升的类型有类型*,但未提升的类型有点类型#.对评论中链接的问题的回答进一步详细说明了这一点.


dan*_*iaz 8

来自GHC 文件:

Lifted

A type is lifted iff it has bottom as an element.
Run Code Online (Sandbox Code Playgroud)

提升类型的值可以是底部.也就是说,它可以是undefined,或者可能是永不完成的计算,或者是抛出异常的计算.

同时,未提升类型没有那些潜在麻烦的额外值.这在纯粹的"语义"级别(如果您不需要这些额外的值)中非常有用,并且它还可以通过减少代价高昂的间接来促进更高效的实现.一个称为工人包装器转换的 GHC优化利用了这一点(参见链接文章的第5.1节).

提升和未提升的类型有不同的类型.提升类型生活*,未提升类型#.

目前,GHC不允许您轻松定义自己的复杂未提升数据类型.但是有提议允许这样做.