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

标签 haskell types

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

我不记得上下文了,但我看到 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 起)解决这个问题。

请注意,您可以使用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评论中链接的问题对此有更多详细信息。

关于haskell - Haskell 中提升和未提升的产品类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39985296/

相关文章:

algorithm - 如何在 Haskell 中调试 BST 验证算法?

c++ - 是否有 O(1) 的方式让 Haskell 读取 C 风格数组?

haskell - 高阶列表和类型族的歧义错误

c - 读取未格式化文件的 Fortran 到 C 的翻译

module - 在 OCaml 中使用模块包含

haskell - 构造函数模式匹配haskell

haskell - 如何在有文化的 Haskell 脚本中启用 GHC 扩展?

Typescript:定义对象

Python总和,为什么不是字符串?

c# - 使用对象类型的字符串名称在 C# 中进行类型转换