haskell-jp / beginners #17 at 2021-08-22 21:27:10 +0900

stack installで次のようなエラーが出てしまいます。
scientific> configure
scientific> Configuring scientific-0.3.7.0...
scientific> build
scientific> Preprocessing library for scientific-0.3.7.0..
scientific> Building library for scientific-0.3.7.0..
scientific> [1 of 5] Compiling GHC.Integer.Compat
scientific> [2 of 5] Compiling Utils
scientific> [3 of 5] Compiling Data.Scientific
scientific> 
scientific> /tmp/stack-fff8d00fdcd912f1/scientific-0.3.7.0/src/Data/Scientific.hs:196:1: error:
scientific>     • Couldn't match type 'm' with 'Language.Haskell.TH.Syntax.Q'
(略)
scientific>         lift :: Scientific -> m Language.Haskell.TH.Syntax.Exp
scientific>           (bound at src/Data/Scientific.hs:196:1)
scientific>     |
scientific> 196 | deriving instance Lift Scientific
scientific>     | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
scientific> 

stack.yamlは次のとおりです。
extra-deps:
  - text-1.2.4.1
  - filepath-1.4.2.1
  - megaparsec-9.1.0
  - parser-combinators-1.3.0
  - template-haskell-2.17.0.0
  - ghc-boot-th-9.0.1

template-haskellを加えると、このエラーが出るようになりました。の依存パッケージにがあり、これが悪さをしているのではないかと思っているのですが、stackの仕組みをまだ理解しておらず、解決できません。何かアイデアはあるでしょうか?
ちなみに、template-haskell単体ではインストールできます。
template-haskellはstackage LTSに含まれているため、extra-depsに書く必要はありません。というかtemplate-haskellのバージョンはGHCのバージョンと同期されている必要があり、ユーザーがバージョンを指定できるものではない気がします。GHC 9.0.1向けのtemplate-haskell-2.17.0.0をGHC 8.10系で使おうとしてそういうエラーが出ているのではないでしょうか。
template-haskellの他にghc-boot-thもGHC組み込みのため、extra-depsから外す必要があります。
ありがとうございます。解決しました。
package.yamlとstack.yamlを混同していました。
いままで、package.yamlのdependenciesとstack.yamlのextra-depsに同じ内容を記述していたのですが、これは必要ないということですか?
基本的には、resolverに含まれないマイナーなパッケージを使用したい場合のみextra-depsに記述します。resolverに含まれない(&extra-depsにも記述されていない)マイナーなパッケージをdependenciesに書いた場合はstackが教えてくれるのでそれを参考にすると良いでしょう。例外として、resolverに含まれるバージョンとは異なるバージョンを明示的に使いたい場合はextra-depsに書きます。
例えばlts-18.7を使う場合は、text-1.2.4.1とfilepath-1.4.2.1はlts-18.7に含まれるのでextra-depsの記述は完全に冗長です。一方、megaparsecとparser-combinatorsはlts-18.7に含まれるバージョンとextra-depsに記述されているバージョンが異なるため、最新の機能やバグ修正を使いたい場合は意味のある記述ということになります。