1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Haskellで競技プログラミングに参加するための最低限の環境を構築する

Posted at

これは何?

本記事はアドベントカレンダー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

2025年11月11日現在9.6.7がrecommendedになっているため、こちらを選択しました。
image.png

2025年11月11日現在、AtCoderのGHCのバージョンは9.8.4です。
そのため、AtCoderに特化するなら9.8.4にあわせるほうが無難かも知れません。

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を誤って使わないようにオフにしておきます。

settings.json
  "github.copilot.enable": {
    "haskell": false
  }

Formatter

ormoluを使います。
下記の設定を追加してもFormatterが効かない場合にはcabalでインストールしておきます。

settings.json
  "[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が統合されているらしい)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?