首页 > 解决方案 > 如何在 Haskell 中使用未装箱的类型

问题描述

有用于 Int、Float 等的未装箱类型 GHC。我知道基于它们构建的代码运行开销较小,但我看不到如何基于未装箱 Int 向/从函数输入和输出数据的方法,即

GHC.Exts 定义了函数 (+#) 和 (*#),但我找不到函数装箱/拆箱

  readInt:: String -> Int#
  showInt:: Int# -> String

  boxInt :: Int# -> Int
  unboxInt :: Int -> Int#

instance Show Int# 和 instance Read Int# 不能存在,因为 show 和 read 是多态的。

如果没有这些功能,我如何将未装箱类型的优化代码块与应用程序的其余部分集成?

标签: haskellghc

解决方案


我知道基于它们构建的代码运行开销更少

尽管在某种意义上这是正确的,但您通常不必担心。GHC 非常努力地优化掉内置类型的盒子,我希望它在大多数情况下都能很好地做到这一点,你也可以手动做到这一点。

在实践中,您应该更加小心的是确保

  • 它实际上看到了它知道未装箱形式的具体Int或类型。Float特别是,这不适用于多态函数(多态通常依赖于框,就像在 OO 语言中一样)。
    如果您希望一个函数是多态的并且仍然使用原始类型快速运行,请确保添加SPECIALIZE注释和/或重写规则。
  • 懒惰不会妨碍你。未装箱的类型总是严格的,所以严格的注解可以让 GHC 更容易地移除盒子。

当然还可以分析您的代码。

只有当你真的确定你想要它时(例如,确保当一个新的 GHC 优化不同时这些框不会重新出现),或者如果你想获得 SIMD 指令,你是否真的应该手动访问未装箱的原始类型。


推荐阅读