代码之家  ›  专栏  ›  技术社区  ›  Wizek

如何最容易地将具有大量导入(许多是合格的)的大型Haskell文件分解为较小的文件?

  •  0
  • Wizek  · 技术社区  · 6 年前

    我有一个大的Haskell文件(大约3000行)和许多导入(大约150行)。我正试图将其分解为更小的文件,以提高构建并行性,从而缩短构建时间。

    1. 很多

    2. 更高级的选项是创建一个CommonImports.hs文件,在其中导入所需的所有内容,然后重新导出ala module CommonImports (module X) where import Foo as X . 这在很大程度上是可行的,但有大约50个进口产品是合格的。据我所知,目前没有办法再出口/再进口保持原来的资格。这可以通过大量的重构来实现,在重构中我删除所有的限定条件并解决任何名称冲突。

    3. #include 特色。我以前就用过这个,而且很管用,甚至保持合格的进口。但是有一些不幸的警告:ghci和ghcid没有注意到 #包括 d文件更改。我试着用一些帮助来克服它:

      import qualified  Language.Haskell.TH.Syntax as TH
      
      #include "./relative/../path/to/File.cpp.hs"
      $(TH.addDependentFile "/absolute/path/to/File.cpp.hs" >> pure [])
      

      https://ghc.haskell.org/trac/ghc/ticket/4900#comment:81

      GHCid是我工作流程的核心,所以这很不幸。

    我错过了你们中的一些人可能使用的其他方法吗?也许有些人有较小的缺点或不同的取舍?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Wizek    6 年前

    关于我们如何处理这种情况的一些想法:

    1. 也许可以选择CPP。重新加载将不起作用,这可能会导致挫折和混乱,但似乎是最好的选择,我们可以实际使用目前。在10个文件中不重复和复制150多行,减少了维护负担。可以手动重新启动GHCi(d),希望它能在 #include 文件。很挑剔,但也许手动记住 touch 更改后的导入文件 d文件。

    2. 也许合并问题4900中的补丁并不困难,因为我们可以忽略hs-boot支持。我完全同意这一点,因为这似乎是一个严格的加法改进,没有放弃任何东西。

    3. Foo.hs 进口合格后再出口 Bar.func1 . 当我 import Foo 条形图.func1 import qualified Foo as F 那我就可以 F.Bar.func1 可用。有兴趣将此作为GHC提案提出。这个特性可以使问题中的选项2成为明显优越的、本机支持的选项。