You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

名称含非字母字符的库,其MIN_VERSION_ℓib宏如何定义?

处理带连字符的Cabal包版本检查CPP宏问题

没错,你碰到的这个坑挺典型的——CPP宏的命名规则比Cabal包名严格得多,连字符-是不允许出现在宏名里的,所以直接写MIN_VERSION_quickcheck-instances(0,3,17)肯定会报错。

简单解决:把连字符换成下划线

Cabal在生成版本检查宏的时候,会自动把包名中的连字符替换成下划线。所以针对quickcheck-instances这个包,正确的宏名应该是MIN_VERSION_quickcheck_instances。

修正后的代码示例:

#if !MIN_VERSION_quickcheck_instances(0,3,17)
instance Arbitrary SBS.ShortByteString where
  arbitrary = fmap SBS.pack arbitrary
#endif

背后的小原理

所有Cabal预定义的MIN_VERSION_<pkgname>宏都会做这个字符转换:只要包名里有不符合CPP宏命名规范的字符(比如连字符),都会被替换成下划线。不管你遇到的是quickcheck-instances还是其他带特殊字符的包,都可以用这个规则来推导正确的宏名。

如果实在拿不准,还可以通过GHC的-E参数预处理代码,直接查看生成的宏定义,就能确认正确的宏名啦。

内容的提问来源于stack exchange,提问作者leftaroundabout

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:37:59