haskell - 如何在 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 是多态的。
如果没有这些功能,我如何将未装箱类型的优化代码块与应用程序的其余部分集成?
解决方案
我知道基于它们构建的代码运行开销更少
尽管在某种意义上这是正确的,但您通常不必担心。GHC 非常努力地优化掉内置类型的盒子,我希望它在大多数情况下都能很好地做到这一点,你也可以手动做到这一点。
在实践中,您应该更加小心的是确保
- 它实际上看到了它知道未装箱形式的具体
Int
或类型。Float
特别是,这不适用于多态函数(多态通常依赖于框,就像在 OO 语言中一样)。
如果您希望一个函数是多态的并且仍然使用原始类型快速运行,请确保添加SPECIALIZE
注释和/或重写规则。 - 懒惰不会妨碍你。未装箱的类型总是严格的,所以严格的注解可以让 GHC 更容易地移除盒子。
当然还可以分析您的代码。
只有当你真的确定你想要它时(例如,确保当一个新的 GHC 优化不同时这些框不会重新出现),或者如果你想获得 SIMD 指令,你是否真的应该手动访问未装箱的原始类型。
推荐阅读
- csv - 如何以编程方式将 CSV 导入 AirTable(任何 API?)
- java - 单击按钮时出现 java.lang.NumberFormatException
- python - 在 NumPy 中设置值链接两个切片
- reactjs - 在 React.js 中将 props 传递给另一个组件
- java - Java - 关于性能和内存使用,为什么最好在静态字段中使用字符串而不是每次需要时都声明它?
- python - Pytest + ModuleNotFoundError:没有名为“project_name.settings”的模块
- python - 如何在 HP unix 中安装所需版本的 pandas 库?
- python - 分组后如何从seaborn swarmplot和各自的箱线图中排列点
- sqlite - SQLite 只返回重复的行
- apache-spark - 如何在 Spark SQL 中完成高度倾斜的联接?