Haskell 我怎么能对阴谋集团有条件?

Haskell 我怎么能对阴谋集团有条件?,haskell,cabal,Haskell,Cabal,我有一个Haskell库,它导出了几个模块。我使用GHC和GHCJS编译该库。我正在使用stack构建库。其中一个模块依赖于反射dom。问题是我无法在GHC上编译reflection dom,因为无法在OSX上链接gtk+3。因此,如果编译器是GHC,我希望排除该库。我怎样才能做到这一点 exposed-modules: MyLib.Foo MyLib.Bar MyLib.App.Backend.Reflex MyLib.App.Backend.Gloss ... buil

我有一个Haskell库,它导出了几个模块。我使用
GHC
GHCJS
编译该库。我正在使用
stack
构建库。其中一个模块依赖于反射dom。问题是我无法在GHC上编译
reflection dom
,因为无法在OSX上链接
gtk+3
。因此,如果编译器是
GHC
,我希望排除该库。我怎样才能做到这一点

exposed-modules:
  MyLib.Foo
  MyLib.Bar
  MyLib.App.Backend.Reflex
  MyLib.App.Backend.Gloss
  ...

build-depends:
    base ...
    reflex-dom >= 0.2 && <0.3
公开模块:
MyLib.Foo
MyLib.Bar
MyLib.App.Backend.reflection
MyLib.App.Backend.Gloss
...
构建取决于:
基础

Reflection dom>=0.2&&虽然您可能不想这样做,但在cabal用户手册的“配置”部分中描述了这样做的方法:

特别是,您应该能够编写如下相关章节:

exposed-modules:
    MyLib.Foo
    MyLib.Bar
    MyLib.App.Backend.Reflex
    MyLib.App.Backend.Gloss
if !impl(ghc)
  exposed-modules:
    OtherModule

build-depends: etc, etc, etc
if !impl(ghc)
   build-depends: etc1, etc2

这是可能的。但是,强烈建议API独立于cabal文件中的条件,因为其他库编写器不可能依赖条件的值。特别是,公开或不公开模块是API的一部分。那么我该如何解决这个问题呢?我必须有一个全新的项目,“MyLib GHCJS stuff”,只是为了那些无法在主项目上编译的东西,即GHC。这似乎根本不对。理想情况下,编译器只是后端目标的一个选择,它不应该反映项目的组织。对,你会有一个可移植的包和一个不可移植的包。