我最近最近遇到了"提升产品类型"一词,与未提升产品类型形成鲜明对比.
我不记得上下文,但我发现Stack Overflow还有其他问题,询问未提升产品类型的缺点(例子).
我或多或少知道什么是产品类型.它类似于(a, b)或Foo a b c大致对应于集合论中的笛卡尔积.
在这种情况下,"解除"和"解除"这两个词的含义是什么?
Ale*_*lec 10
来自GHC文档:
"提升"类型意味着该类型的术语可能是底部.
"boxed"类型表示值由指向堆对象的指针表示.
一些影响包括:
id 0 :: Int#不起作用.看看这个答案,看看你怎么能(因为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 #)
Run Code Online (Sandbox Code Playgroud)
有了这个扩展之外,我相信只有未提升的类型,你会发现在GHC.Exts和是原始类型.有一些讨论,允许自定义未提升的数据类型集成到GHC 这里.
最后一句话:虽然提升的类型有类型*,但未提升的类型有点类型#.对评论中链接的问题的回答进一步详细说明了这一点.
来自GHC 文件:
Lifted
A type is lifted iff it has bottom as an element.
Run Code Online (Sandbox Code Playgroud)
提升类型的值可以是底部.也就是说,它可以是undefined,或者可能是永不完成的计算,或者是抛出异常的计算.
同时,未提升类型没有那些潜在麻烦的额外值.这在纯粹的"语义"级别(如果您不需要这些额外的值)中非常有用,并且它还可以通过减少代价高昂的间接来促进更高效的实现.一个称为工人包装器转换的 GHC优化利用了这一点(参见链接文章的第5.1节).
提升和未提升的类型有不同的类型.提升类型生活*,未提升类型#.
目前,GHC不允许您轻松定义自己的复杂未提升数据类型.但是有提议允许这样做.