これは何?
本記事はアドベントカレンダー3日目の記事です。
本記事では、最低限HaskellでAtCoderに参加するための環境構築を紹介します。
環境
- Ubuntu 22.04 LTS
- Haskell
- ghc: 9.6.7
- VS Code
環境構築する内容
- Haskellが実行できる
- 言語サーバ
- Linter
- Formatter
注意
環境構築に時間をかけたくないため、ベストな環境ではないかもしれません。
追加すべきものなどあればコメント等でご指摘いただけると幸いです。
Haskellのコードを実行できるようにする。
HaskellはGHCというコンパイラを使ってコードをコンパイルし、実行します。
GHCのインストールや、その他のツールをGHCupを使うことで簡単にインストールできるので、こちらを使用します。
GHCupのインストール
GHCupのインストール手順を元にしてインストールします。
# 依存ライブラリ
apt-get update -y
apt-get install --no-install-recommends -y \
build-essential \
curl \
ca-certificates \
libffi-dev \
libffi8 \
libgmp-dev \
libgmp10 \
libncurses-dev \
libncurses5 \
libtinfo5 \
pkg-config
# GHCupのインストール
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
特に指定しない場合~/.ghcup配下にインストールされるのでPATHを通しておきます。
自分は~/.zshrcに以下を設定しています。
# 設定例
[ -f "/home/sigma/.ghcup/env" ] && . "/home/sigma/.ghcup/env" # ghcup-env
GHC、HLS(Haskell Language Server)、cabalのインストール
- GHC: コンパイラ本体
- HLS: 言語サーバ
- cabal: パッケージ管理
をインストールします。
Stackを使っても良いですが、競技プログラミングのためにパッケージ管理は不要かなと考え、私は必要なパッケージが登場した際に都度cabal installでインストールを行う運用を一旦とっています。
ghcup install ghc 9.6.7
ghcup set ghc 9.6.7
ghcup install cabal 3.12.1.0
ghcup set cabal 3.12.1.0
ghcup install hls 2.11.0.0 && \
ghcup set hls 2.11.0.0
VS CodeのExtensionsとセットでぽちぽちやってインストールできるツールもあります。
https://marketplace.visualstudio.com/items?itemName=haskell.haskell
上記のExtensionsを追加後に
- GHCupのPATHが通っている
-
"haskell.manageHLS": "GHCup",(デフォルト)になっている
の場合、VS CodeのGUIからもGHCやHLS等をインストールが可能です。
一応Dockerfileを作り、Dev Container化してはありますが、フォーマッタとHLSが効くことを確認後には面倒なので使ってないです。
とりあえず、動かしてみる
main :: IO()
main = do
putStrLn "Hello, World"
コンパイルしてから実行するのは面倒なのでrunghcを使うのが最も楽だと思います。
# インタプリタで実行する
runghc <file_name>.hs
競技プログラミングの場合入力を手作業で毎回入力するのが面倒なのでtxtファイルを作って渡すのが楽です。
(VS Codeのタスクランナーとか使えばもっと楽そう)
# 入力データをtxtファイルから受け取って実行する(これが一番競技プログラミングに向いてそう)
runghc <file_name>.hs < input.txt
また、ちょっとした検証にはghciコマンドによる対話形式での実行も役に立ちます。
# 対話形式で実行する
ghci
ghci> putStrLn "Hello, World!"
Hello, World!
ghci> :q
Leaving GHCi.
コンテストに参加するための環境をVS Codeで作る
VS Code Extesionsを入れる
GitHub Copilotをオフにする
生成AIを誤って使わないようにオフにしておきます。
"github.copilot.enable": {
"haskell": false
}
Formatter
ormoluを使います。
下記の設定を追加してもFormatterが効かない場合にはcabalでインストールしておきます。
"[haskell]": {
"editor.defaultFormatter": "haskell.haskell",
"editor.formatOnSave": true
},
"haskell.formattingProvider": "ormolu",
cabal install ormolu
CLIで実行したい方は以下を実行することで一括でフォーマットがかかります。
ormolu --mode inplace $(find . -type f -name "*.hs")
Linter
特に設定しなくてもExtensionsが正常に作動していれば使えました。
(HLSにhlintというLinterが統合されているらしい)
