[有用于Int,Float等的GHC未装箱类型。我知道基于它们构建的代码运行开销较小,但我看不到如何在基于未装箱的Int的函数中向/从函数输入和输出数据的方法,即
GHC.Exts定义了函数(+#)和(*#),但是我找不到函数装箱/取消装箱
readInt:: String -> Int#
showInt:: Int# -> String
boxInt :: Int# -> Int
unboxInt :: Int -> Int#
instance Show Int#和实例Read Int#不存在,因为show和read多态。
没有这些功能,如何将未装箱类型的优化代码块与其余应用程序集成在一起?
[Int
,Float
等仅仅是GHC中的data
类型:
data Int = I# Int#
data Float = F# Float#
-- etc.
构造函数仅由GHC.Exts
导出。导入并使用构造函数进行转换:
GHC.Exts
我知道基于它们构建的代码以更少的开销运行
尽管从某种意义上说这是正确的,但您通常不必担心。 GHC竭尽全力优化内置类型的框,我希望它在大多数情况下也能很好地做到这一点,您也可以手动完成。
实际上,您应该更加小心以确保
{-# LANGUAGE MagicHash #-}
import GHC.Exts
main = do I# x <- readLn
I# y <- readLn
print (I# (x +# y))
或Int
类型,并且知道该类型为未装箱的形式。特别是,这确实对多态函数起作用(多态性通常依赖于框,就像它在OO语言中一样)。如果您想要一个函数是多态的并且仍然可以使用基本类型快速运行,请确保添加Float
注释和/或重写规则。那个懒惰不会妨碍你。未装箱的类型始终是严格的,因此严格注释可以使GHC轻松删除框。仅当您确定[确实
时(例如,确保当优化的新GHC出现新的GHC时,该框不会再次出现),或者如果您希望获得SIMD指令, ,实际上应该手动访问未装箱的基本类型。