haskell - 在这个 hsc2hs 的 #let 构造中重复参数的目的是什么?
问题描述
在下面的代码中,它看起来numarray
只需要一个参数,所以我不确定重复#t
的用途是什么,但是当并非所有参数都存在时,它会导致 hsc2hs 异常退出:
#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
解决方案
正如@chi 在评论中指出的那样,每个 %s 都被一个参数替换(很像 printf 和朋友)。我最初猜到了这一点,但是在测试这个时,结果被我使用 hsc2hs 时的一些无声错误所隐藏(有关详细信息,请参阅评论)。
推荐阅读
- python - 随机森林训练测试分割精度
- node.js - 如何将配置文件导入打字稿中的多个文件
- javascript - 如何防止 InstantSearch 被切断?(阿尔戈利亚,React Native)
- ios - 如何在 Xamarin Forms 中为 iOS 构建显示图像
- flutter - 有没有办法在 VS Code 中为 Flutter/Dart 小部件属性获得更好的代码建议?
- javascript - 我应该如何将图像从用户发送到带有 html5 js 的目录?
- c - ld 问题 - rpl_malloc(交叉编译 ARM)
- javascript - Java脚本从数组中的映射中提取所有值
- android - SDK 文件未在 Android Studio 中创建
- google-apps-script - 将值从 master 传递到相应的工作表