HaskellのGet Startedでコンパイルエラーが発生したというお話

そろそろ新しい言語を学びたいなと思い、昨日から新たにHaskellの学習をはじめました。
Haskellの[Get Started](https://www.haskell.org/get-started/)を参考にインストールを進めていたのですが、コンパイル時にエラーが発生してプログラムを動かすことができませんでした。
今後別の環境下で同じエラーが発生しても解決できるようにメモとして残しておきます。

https://www.haskell.org/get-started/

# 動作環境

- Ubuntu 22.04
- GHC 9.2.7
- HLS 1.10.0
- cabel 3.6.2
- Stack 2.9.3

# Haskell開発環境のセットアップ

まずはHaskellの開発環境をセットアップしました。Get Startedを参考にGHCupというユニバーサルインストーラでHaskellで必要なものをすべてインストールします。
[GHCupのホームページ](https://www.haskell.org/ghcup/#)にアクセスするとインストール用のコマンドが表示されているので、そのコマンドを実行します。

```bash
$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
Welcome to Haskell!

This script can download and install the following binaries:
  * ghcup - The Haskell toolchain installer
  * ghc   - The Glasgow Haskell Compiler
  * cabal - The Cabal build tool for managing Haskell software
  * stack - A cross-platform program for developing Haskell projects (similar to cabal)
  * hls   - (optional) A language server for developers to integrate with their editor/IDE

ghcup installs only into the following directory,
which can be removed anytime:
  /home/XXX/.ghcup

-------------------------------------------------------------------------------

Detected bash shell on your system...
Do you want ghcup to automatically add the required PATH variable to "/home/XXX/.bashrc"?

# 省略

===============================================================================

All done!

To start a simple repl, run:
  ghci

To start a new haskell project in the current directory, run:
  cabal init --interactive

To install other GHC versions and tools, run:
  ghcup tui

If you are new to Haskell, check out https://www.haskell.org/ghcup/steps/
```

# GHCiプロンプトでお試し

開発環境の準備が完了したので、Get Startedをそっくりそのまま参考に、`ghci`コマンドを実行してHaskellをお試ししてみました。

```bash
$ ghci

ghci> take 10 (filter even [43..])
[44,46,48,50,52,54,56,58,60,62]
ghci> sum it
530
ghci> it
530
```

これまでJavaやTypeScriptなどの言語に軽く触れてきたのですが、今までとまったく異なる書き方のため驚きました。特に`[数値..数値]`という記法は今まで見たことがなかったため新鮮でした。
ghciプロンプトの2行目に登場している`it`はGHCiの特別な変数らしく、最後の計算結果を記憶しているとのことでした。対話型のプロンプトを利用する場合にはかなり便利そうな機能です。

満足した為、`:quit`コマンドでGHCiプロンプトから抜け出します。

```bash
ghci> :quit
```

# Haskellプログラムの作成

簡単なお試しは終了したので、続いてもGet Startedを参考にHaskellプログラムの作成を行いました。
コードの内容はサンプルをそっくりそのまま参考にしています。

```haskell:hello.hs
main = do
  putStrLn "Hello, World!"
  putStrLn ("Please look at my favorite odd numbers: " ++ show (filter odd [10 .. 20]))
```

このファイルを`ghc`コマンドでコンパイルして`hello`という実行可能ファイルを生成します。

```bash
$ ghc hello.hs 
```

## ここでエラーが発生

表示されたメッセージは以下のような内容でした。

```bash
$ ghc hello.hs 
[1 of 1] Compiling Main             ( hello.hs, hello.o )
Linking hello ...
# 一部省略
/usr/bin/ld.gold: エラー: -lgmp が見つかりません
```

念には念を、ということでサンプルコードをそのままコピペし、再度コンパイルしてみたのですが同様のエラーが発生。

これまでに開発環境のセットアップとプロンプトでの簡単なお試ししか行っていないことから、開発環境のセットアップ時に依存関係のインストールが上手く行かなかったのではと推測しました。

色々と検索してみたところ、似たような問題が発生したという投稿を発見しました。

https://stackoverflow.com/questions/71681370/linking-error-when-trying-to-compile-haskell-code

この記事によると、システムにリンクするためのライブラリがインストールされていない、とのこと。`libgmp-dev`をインストールし、再度コンパイルを行ってみます。

```bash
$ sudo apt install libgmp-dev
$ ghc hello.hs
$ ./hello
```

無事、`hello.hs`ファイルをコンパイルすることができました。

# まとめ

今回はHaskellのGet Startedをそっくりそのまま真似していたはずが、エラーが発生してしまったため、その時のことを記事にしてみました。

今回のように、必要な依存関係がインストールされていないことは稀によくあるという話をつい先日聞いていたので、実にタイムリーな内容でした。
インストール対象はともかく、その依存関係まで正しくインストールされていることをその場で確認する方法はあるのでしょうか。。。

（それを調べるのは今後の課題にするとして、）何とかHaskellの開発環境を構築することができました。かなり学習コストが高そうなので焦らずに学習を続けていきたいと思います。