我最近遇到了“提升产品类型”一词,与未提升产品类型形成对比。
我不记得上下文了,但我看到 Stack Overflow 上还有其他问题询问未提升的产品类型的缺点 ( example )。
我或多或少知道什么是产品类型。它类似于 (a, b)
或 Foo a b c
,大致对应于集合论中的笛卡尔积。
在此上下文中,术语“提升”和“未提升”意味着什么?
最佳答案
来自GHC docs :
“lifted” type means that terms of that type may be bottom.
“boxed” type means that a value is represented by a pointer to a heap object.
一些影响包括:
- 提升类型被装箱(但不一定是其他方式 - 请查看上面的链接了解更多信息)
- 未装箱的类型不能有 thunk(因为这些是指向数据的指针,告诉您如何生成值),所以不要偷懒。他们实际上只是持有值(value)观。这也意味着它们可以更快。
- 多态性不适用于未提升的类型。每当您看到类型变量时,所有涉及的类型都会被取消。像
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评论中链接的问题对此有更多详细信息。
关于haskell - Haskell 中提升和未提升的产品类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39985296/