我需要让程序的一些小块在不同的平台上表现得不同。GHC似乎不太擅长交叉编译,所以我计划在Linux和Windows上编译相同的代码。
建议用什么方法来实现这一点?我是否必须编写一个模块的多个版本,或者有一些类似预处理器指令的东西可以放入我的代码中,以有条件地编译一个或另一个代码块?
附言:我使用GHC和Cabal进行管理
GHC支持通过C预处理器运行代码。这不是一个非常Haskelly的解决方案,但它是在实践中必要时使用的。
编辑:泽塔指出,有一个针对每个文件的语言选项(我真的知道,但在上面的链接中没有提到):
{-# LANGUAGE CPP #-}
对于Cabal,可以使用extensions
字段。引用一下,因为它提到了这个用例:
扩展:标识符列表
每个模块使用的Haskell扩展的列表。扩展名是Extension类型的构造函数。这些决定了相应的编译器选项。特别是,CPP指定使用C预处理器对Haskell源文件进行预处理。
可以通过在受影响的源文件中放置LANGUAGE杂注来指定仅由一个模块使用的扩展名,例如:{-#LANGUAGE CPP,MultiParamTypeClasses#-}