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

时间:2016-10-11 19:36:07

标签: haskell types

我最近遇到过这个术语"提升了产品类型"最近,与一个未被解除的人相比。

我无法回想起上下文,但我发现Stack Overflow还有其他问题询问未提升产品类型的缺点(example)。

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

条款"解除了什么"并且"未提升"在这种情况下意味着什么?

2 个答案:

答案 0 :(得分:10)

来自GHC docs

  

“提升”类型意味着该类型的术语可能是底部。

     

“boxed”类型表示值由指向堆对象的指针表示。

一些含义包括:

  • 提升类型已装箱(但不一定是另一种方式 - 请查看上面的链接了解更多信息)
  • 未装箱的类型不能有thunk(因为这些是指向数据的指针,告诉你如何产生值),所以没有懒惰。他们真的只是持有价值观。这也意味着他们可以更快。
  • 多态性不适用于未提升的类型。每当您看到一个类型变量时,所有涉及的类型都会被解除。像id 0 :: Int#这样的东西不起作用。查看this answer以了解如何(因为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 #)

除了这个扩展名,我相信你会发现的唯一未提升的类型是GHC.Exts并且是原始类型。有一些讨论允许将自定义未提升的数据类型集成到GHC here中。

最后一句话:虽然提升的类型有*种类,但未提升的类型有#种类。 This answer对评论中链接的问题进行了详细介绍。

答案 1 :(得分:8)

来自GHC documentation

Lifted

A type is lifted iff it has bottom as an element.

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

与此同时,未提升的类型没有那些潜在麻烦的额外值。这在纯粹的“语义”级别(如果您不需要这些额外的值)中非常有用,并且它还可以通过减少代价高昂的间接来促进更高效的实现。名为the worker-wrapper transformation的GHC优化利用此功能(参见链接文章的第5.1节)。

提升和未提升的类型有不同的类型。提升类型位于* #中的未提升类型。

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