gpt4 book ai didi

haskell - cabal 何时重新编译包含 Template Haskell 的模块?

转载 作者:行者123 更新时间:2023-12-04 15:50:23 26 4
gpt4 key购买 nike

我知道如果任何依赖项的接口(interface)发生更改,cabal 将重新编译模块。如果模块包含 Template Haskell,这个简单的规则似乎不成立。在这种情况下,即使只是在模块(传递)依赖项中的文件中添加尾随换行符,也会导致 cabal 重新编译文件。

最小的例子:

文件:Foo.hs

module Foo where
foo = "foo"

文件:FooTH.hs
{-# LANGUAGE TemplateHaskell #-}
module FooTH where
import Data.Bifunctor.TH
import Foo

data FooPair a b = FooPair a b
$(deriveBifunctor ''FooPair)

文件:MCVE.cabal
name:                MCVE
version: 0.1.0.0
synopsis: MCVE
license: MIT
license-file: LICENSE
author: tarleb
maintainer: tarleb@example.com
build-type: Simple
extra-source-files: CHANGELOG.md
cabal-version: >=1.10

library
exposed-modules: Foo
, FooTH
build-depends: base >=4.8 && <4.13
, bifunctors
default-language: Haskell2010

在 Foo.hs 中添加换行符,例如通过运行 echo "\n" >> Foo.hs , 将导致模块 FooTH 的重新编译。如果 FooTH 中的 TH 行被注释掉,这种情况就不会发生。

这是什么原因,有没有办法避免这种不必要的重新编译?

最佳答案

模板 Haskell 中有一个名为 addDependentFile 的功能。 ,它将元数据添加到 .hi文件表明有问题的源文件也依赖于另一个文件。据我所知,Cabal 总是会要求 GHC 尝试构建,尽管它可能具有更智能的逻辑。 Stack 试图绕过该过程,并具有解析 addDependentFile 的逻辑。信息出来。

关于haskell - cabal 何时重新编译包含 Template Haskell 的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53135728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com