【问题标题】:What is % in the Haskell preprocessor and how does it relate to types like Uint8 (if at all)?Haskell 预处理器中的 % 是什么,它与 Uint8 之类的类型(如果有的话)有什么关系?
【发布时间】:2020-09-14 17:26:18
【问题描述】:

我想总体上更好地理解following code

MDouble 的实例包含在 sn-p 中以演示不使用预处理器的示例。

#let numarray t = "\
foreign import ccall unsafe mxIs%s :: MXArrayPtr -> IO CBool\n\
instance MXArrayComponent M%s where\n\
  isMXArray a = boolC =.< withMXArray a mxIs%s\n\
  createMXArray s = withNDims s (uncurry $ createNumericArray (mxClassOf (undefined :: M%s)) False) >>= mkMXArray\n\
  \
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 docs 中看到很多对# 的引用,但到目前为止还没有提到%

【问题讨论】:

  • 本题目前多题合一。它应该只关注一个问题。
  • 我明白为什么会这样,尽管正如答案所示,它们以非常直接的方式相关。

标签: haskell hsc2hs


【解决方案1】:

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

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

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

%sprintf 中指定了一个字符串参数(您可以看到更完整的解释,例如here)。

所以不涉及Uint8 类型;它只是一个字符串,当您将其替换为 numarray 时,您会得到

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

这种类型被记录在here:

type MUint8 = Word8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多