如何在Haskell中处理未装箱的类型

问题描述 投票:0回答:2

[有用于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多态。

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

haskell ghc
2个回答
2
投票

[IntFloat等仅仅是GHC中的data类型:

data Int = I# Int#
data Float = F# Float#
-- etc.

构造函数仅由GHC.Exts导出。导入并使用构造函数进行转换:

GHC.Exts

0
投票

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

尽管从某种意义上说这是正确的,但您通常不必担心。 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指令, ,实际上应该手动访问未装箱的基本类型。
© www.soinside.com 2019 - 2024. All rights reserved.