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

Haskell中提升和未提升的产品类型是什么?,haskell,types,Haskell,Types,我最近遇到了“提升产品类型”这个词,与未提升产品类型形成了对比 我记不起上下文了,但我看到关于堆栈溢出还有其他问题,询问未升级的产品类型()的缺点 我或多或少知道什么是产品类型。它类似于(a,b)或fooabc,大致相当于集合论的笛卡尔积 在这种情况下,“解除”和“未解除”是什么意思?来自GHC: 可以选择提升类型的值。也就是说,它可以是未定义的,或者可能是永远不会完成的计算,或者抛出异常的计算 同时,未fted的类型没有那些潜在麻烦的额外值。这在纯粹的“语义”级别上是有用的(如果您不想要这些额

我最近遇到了“提升产品类型”这个词,与未提升产品类型形成了对比

我记不起上下文了,但我看到关于堆栈溢出还有其他问题,询问未升级的产品类型()的缺点

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

在这种情况下,“解除”和“未解除”是什么意思?

来自GHC:

可以选择提升类型的值。也就是说,它可以是
未定义的
,或者可能是永远不会完成的计算,或者抛出异常的计算

同时,未fted的类型没有那些潜在麻烦的额外值。这在纯粹的“语义”级别上是有用的(如果您不想要这些额外的值),并且它还可以通过减少昂贵的间接操作来促进更高效的实现。一个名为GHC的优化利用了这一点(参见链接文章的第5.1节)

提升和未提升类型有不同的类型。提升类型存在于
*
中,未提升类型存在于
#

目前,GHC不允许您轻松定义自己的复杂未fted数据类型。但是有一种方法可以做到这一点。

来自:

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

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

一些影响包括:

  • 提升类型已装箱(但不一定是另一种方式-查看上面的链接了解更多信息)
  • 未绑定的类型不能有thunk(因为它们是指向数据的指针,告诉您如何生成值),所以没有惰性。他们真的只是持有价值观。这也意味着他们可以更快

  • 多态性不适用于未fted的类型。每当您看到一个类型变量时,所有涉及的类型都是未启用的。像
    ID0::Int 35;
    这样的东西不起作用。看看你是如何(从GHC 8.0开始)解决这个问题的
请注意,您可以使用
MagicHash
unxedtuples
扩展在GHC中创建未升级的产品(尽管我认为它们与GHCi的关系不太好):

除了这个扩展之外,我相信您将在
GHC.Exts
中找到的唯一未fted类型是基元类型。有一些讨论允许将自定义的未fted数据类型集成到GHC中


最后一句话:虽然提升的类型有种类
*
,但未提升的类型有种类
。对于评论中链接的问题,我们将对此进行更详细的说明。

相关问题:“多态性不会与未升级的类型一起使用”:bzzzt。多态性不适用于未绑定的类型。多态性可以很好地处理未更新的类型,例如,在ML中(尽管Haskell的kind系统可能不够灵活,无法支持它)。@jcast True-我指的是Haskell的kind系统上下文中的注释,其中类型变量具有kind
*
,除非另有规定。下面的链接实际上展示了如何使用GHC 8.0的较新轻浮多态性特性解除这一限制。这说明了吗?如果您愿意,多态性可以通过使用种类多态性来处理未fted的类型:
forall(k::RuntimeRep)(t::typek)
:)
Lifted

A type is lifted iff it has bottom as an element.
{-# 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 #)