Haskell 環境構築＋カンタンなものを実行

# インストール方法（結論）
せっかちなアナタに向けて。インストール済みのものは省いてね。
```bash
sudo apt update
sudo apt gcc
sudo apt g++
sudo apt make
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
sudo apt install libgmp3-dev
# Main.hs ファイルを作成する（省略）
ghc Main.hs # Main.hsファイルをコンパイル
./Main # 実行ファイルMainを実行
```
GHCupをインストールするまでで良ければコレで終わり。

# 前提
動作環境：WSL2(Ubuntu22.04)
curlがインストールされていること（`curl --version`で確認）
![curl_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/15f278af-74eb-bb3c-b180-bb97064de9cf.png)

後述するがCコンパイラ、`g++`、`make`も必要だった。結論としては下記コマンドでインストールした。
```bash
sudo apt update
sudo apt gcc
sudo apt g++
sudo apt make
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
```


# Haskell環境構築指針

参考：[Haskellの環境構築2023](https://zenn.dev/mod_poppo/articles/haskell-setup-2023)
下記コマンドを実行。何度か入力を聞かれるので、Enter押下→１回目は`p`、２回目は`y`、３回目は`y`→Enter押下、にした。
```bash
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
```
## コマンド補足
`curl --proto '=https'`：[curl - How to use](https://curl.se/docs/manpage.html#--proto) いわく、`https`プロトコルだけ許可する、の意味
`--tlsv1.2`：[curl - How to use](https://curl.se/docs/manpage.html#--tlsv12) いわく、TLSサーバー接続時にバージョン1.2以降を指定する、の意味
`-sSf`：[curl - How to use](https://curl.se/docs/manpage.html) いわく、`-s`がsilend mode（進捗とかエラーメッセージの非表示）、`-S`がshow error の略。silent mode 使用時にエラー情報は表示する。`-f`はfail、どこで失敗したか教えてくれ、みたいな感じらしい。

## インストール（失敗）＋失敗原因１
試しに`ghcup list`コマンドを実行すると `command not found` と。失敗したことがわかる。
![ghcup_install_failed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/42ce4aae-1941-4058-7868-8592b279842d.png)

ログを確認してみた。赤枠にある通り、Cコンパイラがないことが原因らしい。
![ghcup_cat_log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/d2931a14-229d-9497-6284-bae3bc356667.png)


gcc(GNU Compiler Collection)をインストールすれば良さそうなので試してみる。

![gcc_install_cmd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/d14f7a73-9b74-c77d-edfa-7092a4390a21.png)
このコマンドでインストールできそう。`apt`のアップデートを忘れずに。
```bash
sudo apt update
sudo apt install gcc
```
インストールできたことを確認。
![gcc_versio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/84699546-87fa-6071-e80f-7cc2a46ec21f.png)

## インストール（失敗）＋失敗原因２
```bash
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
```
![ghcup_install_failed_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/e97044a7-ce8c-cfc9-ebce-95ea2ee41fa1.png)

`g++`も必須とのこと。インストールコマンドは・・・
![g＋＋_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/ab014977-72e6-84f8-44d8-80e70509268f.png)
ですよね。じゃあインストールしてっと。
```bash
sudo apt install g++
```
インストールできたことを確認。
![g＋＋_version_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/8fc6ea9a-15a5-4d01-2d3a-dfec8d3e90e3.png)

## インストール（失敗）＋失敗原因３
```bash
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
```
![cat_log_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/5d2f8bba-1225-8c24-053e-be3c55812ef5.png)
`make`コマンドも必要とのこと。
```bash
sudo apt install make
```
makeもインストールできた。
![make_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/2cc805fb-1fd7-570b-7953-2bcc362c5b83.png)

## インストール（成功）
```bash
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
```
![ghcup_cat_log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/66ccc62e-187a-62d1-4395-de3312847257.png)

忘れずに、環境変数を再読み込みする。↑の画像に書いてある通り。
```bash
source /home/[ユーザ名]/.ghcup/env
```

# Haskellを試す

バージョンを確認する。
![ghc_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/e1010058-2d0d-a3cd-2ef5-97f725bad4e7.png)


それが終わったら `ghci` コマンドから対話環境を試してみる。
参考：[Haskellの環境構築2023](https://zenn.dev/mod_poppo/articles/haskell-setup-2023#%E5%AF%BE%E8%A9%B1%E7%92%B0%E5%A2%83%E3%82%92%E8%A9%A6%E3%81%99)
`product [1..5]` で５の階乗を計算してもらう。
`:quit` で対話環境を抜ける。
![再読み込み＋ghciお試し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/2e03c744-5ad9-1176-d92d-7c6a081c75c6.png)

ソースコードを書いて試してみる。`Main.hs`ファイルを作成する。
```haskell
main = do
    print "Hello, World!"
```
```bash
ghc Main.hs
```
![cannot_find_lgmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/4238a151-99ca-69c3-de32-62c649c7c5b3.png)

下記サイトいわく、`cannot find -lgmp` は gmpがライブラリにないですよ、という意味らしい
参考：[[linux]コンパイル時に「ld: cannot find -l」となるときの解決方法](https://chidipy.jpn.com/topics/?p=44)

下記サイトでは、Ubuntuでは`sudo apt-get install libgmp3-dev`を実行すればいいよ、とのこと。
ただ、情報が古いのでライブラリ名を確認してみる。
参考：[Stack Overflow - /usr/bin/ld: cannot find -lgmp](https://stackoverflow.com/questions/21603772/usr-bin-ld-cannot-find-lgmp)

また、インストール済みだがシンボリックリンクの問題でエラーが出ているパターンも考えられる。
参考：[makeするとライブラリが入っているのに /usr/lib/ld: cannot find と怒られる問題](https://please-sleep.cou929.nu/20080718.html)
ライブラリがインストールされているか確認してみる。
![ldconfig_gmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/6ba0bdb9-19d7-ac6c-0e08-6dd562cc7c07.png)
検索にはヒットしたが、先ほど登場したライブラリとは異なるようだ。

ライブラリが同名で存在するか確認してみる。
```bash
sudo apt search gmp
```
![apt_search_gmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/df6fa2d6-c1b5-9f7b-4422-144f9f751c1e.png)

あったのでインストール。
```bash
sudo apt install libgmp3-dev
```
インストールできたことを確認。正直よくわかってないけど増えてる。
![ldconfig_gmp_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/75825f08-3e7c-b1ff-1136-1c5bdd201b36.png)

もう一度試してみる。
まず`ghc`コマンドでコンパイル。
```Bash
ghc Main.hs
```
エラーが表示されなかったので `ls` してみる。実行ファイル`Main` が作成されていることを確認。
実行ファイル`Main` を実行してみる。
![Main実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222234/9ae31d44-9e74-c3f8-cbbd-441a1901ff78.png)

# 参考サイト一覧
[Haskellの環境構築2023](https://zenn.dev/mod_poppo/articles/haskell-setup-2023)
[[linux]コンパイル時に「ld: cannot find -l」となるときの解決方法](https://chidipy.jpn.com/topics/?p=44)
[Stack Overflow - /usr/bin/ld: cannot find -lgmp](https://stackoverflow.com/questions/21603772/usr-bin-ld-cannot-find-lgmp)
[makeするとライブラリが入っているのに /usr/lib/ld: cannot find と怒られる問題](https://please-sleep.cou929.nu/20080718.html)