Haskell 通过GHC'传递一种ByteArray类型意味着什么;什么是FFI?

Haskell 通过GHC'传递一种ByteArray类型意味着什么;什么是FFI?,haskell,ghc,ffi,Haskell,Ghc,Ffi,在Haskell 2010报告中,从中,列出了外国金融机构进出口申报中支持的基本类型: 以下类型构成基本外来类型集: Haskell Prelude导出的Char、Int、Double、Float和Bool,以及 Int8,Int16,Int32,Int64,Word8,Word16,Word32,Word64,Ptr a,funtr a,以及stabletr a,适用于外国公司出口的任何类型a (第24节) 实施FFI的Haskell系统需要能够通过 这些类型在Haskell和外部上下文之

在Haskell 2010报告中,从中,列出了外国金融机构进出口申报中支持的基本类型:

以下类型构成基本外来类型集:

  • Haskell Prelude导出的
    Char
    Int
    Double
    Float
    Bool
    ,以及
  • Int8
    Int16
    Int32
    Int64
    Word8
    Word16
    Word32
    Word64
    Ptr a
    funtr a
    ,以及
    stabletr a
    ,适用于外国公司出口的任何类型
    a
    (第24节)
实施FFI的Haskell系统需要能够通过 这些类型在Haskell和外部上下文之间作为函数 参数和结果

根据GHC手册中关于外国金融机构扩展的部分:

以下未装箱类型可用作基本外来类型(请参阅 外国金融机构附录,第3.2节):
Int
Word
Char
Float
Double#
Addr#
StablePtr#a
可变字节数组
ForeignObj
,以及
ByteArray

当我指定
ccall
调用约定时,这些类型中的大多数在链接器级别发生了什么,这一点非常清楚。例如,我非常确定
Int
/
Int#
作为两个32位值在堆栈上传递。类似地,
Ptr a
/
StablePtr a
/
StablePtr#a
/
Addr#
可能都作为堆栈上的指针传递

那么
ByteArray
MutableByteArray
呢?


我所能想象的就是将它们作为指针传递,但这似乎有点疯狂,因为除非您将
ByteArray
/
MutableByteArray
固定,否则GHC运行时可能会将数组从您下方移走。此外,您还将忽略阵列上的大小信息。

感谢@ThomasM.DuBuisson挖掘出一个:

有一种方法可以传递未固定的
ByteArray
(或
MutableByteArray
), 但前者在您的情况下似乎是正确的)使用
unlifedfitypes
语言扩展。
ByteArray
保证 在通话期间不能移动。代码应该处理
ByteArray
参数就像是指向字节的指针一样。你需要 在C端进行任何地址偏移计算(即通过任何 作为C函数的额外参数所需的偏移量)

所以:这些都是作为指针传递的,GHC的运行时承诺不会将它们从您的下方移动