Haskell预处理器中的%是什么,它与Uint8等类型有什么关系(如果有的话)?



我想更好地理解以下代码。

代码段中包含MDouble的实例,以演示不使用预处理器的示例。

#let numarray t = "
foreign import ccall unsafe mxIs%s :: MXArrayPtr -> IO CBooln
instance MXArrayComponent M%s wheren
isMXArray a = boolC =.< withMXArray a mxIs%sn
createMXArray s = withNDims s (uncurry $ createNumericArray (mxClassOf (undefined :: M%s)) False) >>= mkMXArrayn

mxArrayGetOffset = arrayDataGet ;
mxArraySetOffset = arrayDataSet ;
mxArrayGetOffsetList = arrayDataGetList ;
mxArraySetOffsetList = arrayDataSetList
n
instance MXArrayData MX%s M%s
", #t, #t, #t, #t, #t, #t
foreign import ccall unsafe mxIsDouble :: MXArrayPtr -> IO CBool
foreign import ccall unsafe mxCreateDoubleScalar :: MXDouble -> IO MXArrayPtr
foreign import ccall unsafe mxGetScalar :: MXArrayPtr -> IO MXDouble
instance MXArrayComponent MDouble where
isMXArray a = boolC =.< withMXArray a mxIsDouble
createMXScalar = mxCreateDoubleScalar . hs2mx >=> mkMXArray
mxScalarGet a = withMXArray a mxGetScalar
createMXArray s = withNDims s (uncurry $ createNumericArray (mxClassOf (undefined :: Double)) False) >>= mkMXArray
#arrayDataComponent
instance MXArrayData MXDouble MDouble
#numarray Single
#numarray Int8
#numarray Int16
#numarray Int32
#numarray Int64
#numarray Uint8
#numarray Uint16
#numarray Uint32
#numarray Uint64

但特别是,看起来他们正在使用某些类型,如Uint8等,我不确定这些是在哪里定义的,或者为什么例如 不改用Word8。另外,不确定如何使用%s。我在 hsc2hs 文档中看到了很多对#的引用,但到目前为止还没有关于%的内容。

关键是链接文档中的粗体句子:

#let ⟨name⟩ ⟨parameters⟩ = "⟨definition⟩"

定义要应用于 Haskell 源的宏。参数名称以逗号分隔,不在参数内。此类宏作为其他 #-构造调用,从 #name 开始。该定义将作为 printf 的参数放在括号内的 C 程序中。要引用参数,请关闭引号,输入参数名称并再次打开引号,以使 C 字符串文本连接。或者使用 printf 的格式指令。参数的值必须作为字符串给出,除非宏使用 C 预处理器的 #parameter 语法将它们本身字符串化。

%sprintf中指定一个字符串参数(您可以看到更完整的解释,例如 这里(.

所以不涉及Uint8类型;它只是一个字符串,当你把它代入numarray时,你会得到

foreign import ccall unsafe mxIsUint8 :: MXArrayPtr -> IO CBool
instance MXArrayComponent MUint8 where
...

此类型记录在此处:

type MUint8 = Word8

最新更新