はじめに
Atcoderの問題を解くときには、Haskellでコードを書いてstack ghci
をして :l
でファイルをロードしてサンプルケースを試す、というやり方をしています。
Atcoderでは利用できるプログラミング言語と、各言語で利用可能なライブラリが一覧されているので、ここに記載されているGHCのバージョン、パッケージがGHCiで利用できるよう設定をするのがゴールです。
ルール - C++入門 AtCoder Programming Guide for beginners (APG4b)
やったこと
通常のHaskellプロジェクト同様、次の設定ファイルを作成します。
通常は実行ファイルやテストの設定も書きますが、今回はGHCや各パッケージのバージョンが指定できればOKです。最低限必要そうな設定だけを残した結果、最終的に各ファイルはこのような内容になりました。
stack.yaml
resolver: ghc-8.8.3 packages: - . extra-deps: - QuickCheck-2.13.2 - array-0.5.4.0 - attoparsec-0.13.2.3 - bytestring-0.10.10.0 - containers-0.6.2.1 - deepseq-1.4.4.0 - extra-1.7.1 - fgl-5.7.0.2 - hashable-1.3.0.0 - heaps-0.3.6.1 - integer-logarithms-1.0.3 - primitive-0.7.0.1 - psqueues-0.2.7.2 - random-1.1 - reflection-2.1.5 - template-haskell-2.15.0.0 - text-1.2.4.0 - unboxing-vector-0.1.1.0 - vector-0.12.1.2 - vector-algorithms-0.8.0.3 - vector-th-unbox-0.2.1.7
package.yaml(プロジェクト名などの情報は省略しています)
dependencies: - base >= 4.7 && < 5 - array - containers - bytestring - hashable - psqueues - vector library: source-dirs: - .
とりあえずすぐに使いそうなものだけを package.yaml
に書いています。
パッケージの設定についてはこの公式記事がわかりやすかったです。
stack.yaml vs cabal package files - The Haskell Tool Stack
ここで stack ghci
をすると version 8.8.3
で動いていそうです。
Configuring GHCi with the following packages: GHCi, version 8.8.3: https://www.haskell.org/ghc/ :? for help
:show packages
でロードされているパッケージを確認してみます。
> :show packages active package flags: -package-id vector-0.12.1.2-AWRYcz9jfa25Avs2q9Jg9V -package-id psqueues-0.2.7.2-FrNNxh57zmjqe5jR5GXac -package-id hashable-1.3.0.0-CzctMgLWbfP4pv5F2JiKgj -package-id containers-0.6.2.1 -package-id bytestring-0.10.10.0 -package-id base-4.13.0.0 -package-id array-0.5.4.0
期待通りstack.yaml
で指定しているバージョンがロードされています。