如何在Haskell中使用非固定类型
对于Int、Float等,有非固定类型GHC。 我知道基于它们构建的代码运行时开销较小, 但是我看不到一种方法如何在基于unboxed Int的函数中输入和输出数据 Exts定义函数+和*,但我找不到函数boxing/unboxy如何在Haskell中使用非固定类型,haskell,ghc,Haskell,Ghc,对于Int、Float等,有非固定类型GHC。 我知道基于它们构建的代码运行时开销较小, 但是我看不到一种方法如何在基于unboxed Int的函数中输入和输出数据 Exts定义函数+和*,但我找不到函数boxing/unboxy readInt:: String -> Int# showInt:: Int# -> String boxInt :: Int# -> Int unboxInt :: Int -> Int# 实例Show Int和实例Rea
readInt:: String -> Int#
showInt:: Int# -> String
boxInt :: Int# -> Int
unboxInt :: Int -> Int#
实例Show Int和实例Read Int不能存在,因为Show和Read多态
如果没有这些功能,我如何将未绑定类型上的优化代码块与应用程序的其余部分集成?Int、Float等只是GHC中的数据类型:
data Int = I# Int#
data Float = F# Float#
-- etc.
构造函数仅由导出。导入它并使用构造函数转换:
{-# LANGUAGE MagicHash #-}
import GHC.Exts
main = do I# x <- readLn
I# y <- readLn
print (I# (x +# y))
Int、Float等只是GHC中的数据类型:
data Int = I# Int#
data Float = F# Float#
-- etc.
构造函数仅由导出。导入它并使用构造函数转换:
{-# LANGUAGE MagicHash #-}
import GHC.Exts
main = do I# x <- readLn
I# y <- readLn
print (I# (x +# y))
我知道构建在它们之上的代码运行时开销较小
虽然这在某种意义上是正确的,但你通常不必担心。GHC非常努力地优化内置类型的框,我希望它在大多数情况下都能做得很好,您也可以手动完成
在实践中,你应该更加小心的是确保
它实际看到的是具体的Int或Float类型,它知道该类型的unboxed形式。特别是,这不适用于多态函数多态性通常依赖于框,就像在OO语言中一样。如果您希望函数是多态的,并且仍然可以使用基元类型快速运行,请确保添加专门化注释和/或重写规则。
懒惰不会妨碍你。未装箱的类型总是严格的,因此严格性注释可以使GHC更容易地删除这些框。
当然,还要分析你的代码
只有当您确实确定需要时,例如,为了确保当新的GHC以不同方式进行优化时,框不会重新出现,或者如果您希望获得SIMD指令,您才应该实际手动访问未绑定的基本类型
我知道构建在它们之上的代码运行时开销较小
虽然这在某种意义上是正确的,但你通常不必担心。GHC非常努力地优化内置类型的框,我希望它在大多数情况下都能做得很好,您也可以手动完成
在实践中,你应该更加小心的是确保
它实际看到的是具体的Int或Float类型,它知道该类型的unboxed形式。特别是,这不适用于多态函数多态性通常依赖于框,就像在OO语言中一样。如果您希望函数是多态的,并且仍然可以使用基元类型快速运行,请确保添加专门化注释和/或重写规则。
懒惰不会妨碍你。未装箱的类型总是严格的,因此严格性注释可以使GHC更容易地删除这些框。
当然,还要分析你的代码
仅当您确实确定需要时,例如,为了确保在新的GHC以不同方式进行优化时,框不会重新出现,或者如果您希望获得SIMD指令,您是否应该手动访问未绑定的基本类型。如果GHC.Prim模块没有定义Int->Int和back的助手方法那么简单,那么back方法确实存在:I本身。@DaneelS.Yaitskov,因为您不需要自己处理未绑定的基本类型。看看我的答案。如果GHC.Prim模块没有定义Int->Int和back的helper方法这么简单的话?back方法确实存在:我自己。@DaneelS.Yaitskov,因为你不需要自己处理未绑定的基本类型。看看我的答案。