Haskell(GHCi)のAtcoder用の実行環境を整えたメモ

はじめに

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 で指定しているバージョンがロードされています。

References