我最近遇到过这个术语"提升了产品类型"最近,与一个未被解除的人相比。
我无法回想起上下文,但我发现Stack Overflow还有其他问题询问未提升产品类型的缺点(example)。
我或多或少知道什么是产品类型。它类似于(a, b)
或Foo a b c
,大致相当于集理论中的笛卡尔积。
条款"解除了什么"并且"未提升"在这种情况下意味着什么?
答案 0 :(得分:10)
来自GHC docs:
“提升”类型意味着该类型的术语可能是底部。
“boxed”类型表示值由指向堆对象的指针表示。
一些含义包括:
id 0 :: Int#
这样的东西不起作用。查看this answer以了解如何(因为GHC 8.0)有时可以在此周围进行操作。请注意,您可以使用MagicHash
和UnboxedTuples
扩展程序在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允许这样做。