Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Haskell中使用非固定类型_Haskell_Ghc - Fatal编程技术网

如何在Haskell中使用非固定类型

如何在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

对于Int、Float等,有非固定类型GHC。 我知道基于它们构建的代码运行时开销较小, 但是我看不到一种方法如何在基于unboxed Int的函数中输入和输出数据

Exts定义函数+和*,但我找不到函数boxing/unboxy

  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,因为你不需要自己处理未绑定的基本类型。看看我的答案。