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