1. 導入

1.1. 開発環境

2024年1月現在,開発環境のインストールはGHCupを使います(最新の推奨インストール方法はHaskell公式ページを確認してください).GHCup公式サイトのInstallationページを参考に以下の開発ツール一式をインストールしてください.ただし,ghcirunghcは,ghcをインストールすると一緒にインストールされます.

  • ghc コンパイラ.The Glasgow Haskell compilerの略.

    • ghci 対話型インタープリタ(REPL)

    • runghc インタープリタ.コンパイルせずにHaskellソースコードを実行できる.

  • stack ビルドツール & パッケージ管理ツール

  • cabal 旧ビルドツール.インストールするパッケージによってビルドツールが違うため,stackもcabalもどちらもインストールしておいた方が良い.

  • HLS 言語サーバー(Haskell Language Server).Editorとコンパイラを繋ぎ開発支援を行う.

GHCup使用の補足
  • GHCupは~/.ghcup/bin以下にインストールされます.インストール後,このディレクトリにパスを通します.これでghcupをコマンドラインから起動できます.

  • GHCupで開発ツール一式のダウンロードを終えたら,以下のコマンドを実行して使用するghcのバージョンをセットします.バージョン番号は適宜ダウンロードしたものに合わせてください.

    $ ghcup set ghc 9.4.8
  • コマンドラインからghc --versionと起動してバージョン番号が表示されればインストール成功です.

1.2. エディタの準備

Haskellの開発をサポートするエディタは色々ありますが,ここではVSCodeを使います.公式ページからダウンロード・インストールしてください.

プログラミング用のエディタのメニューは日本語に設定せず,英語のままで使うことをお勧めします.プログラミングの情報は多くが英語です.英語のメニューに慣れておくと,英語の情報ページやYouTubeの解説動画を参考にするときに苦労しません.また,英語のメニューから対応する日本語には頭の中ですぐに変換できるので,日本語の情報サイトを使う場合も問題になりません.

VSCodeをインストールしたら,左側の縦に並んだアイコンからExtensionsボタンを押して,下の画像の3つのExtensionsをインストールしてください.上の検索フィールドにExtension名を入力すると現れます.

Haskell Extension

1.3. Hello World

まずはプログラミング言語の学習にお決まりの儀式,"Hello world"を画面に表示させましょう.Haskell学習用にフォルダを作成しVSCodeでそのフォルダを開きます.これがプロジェクトフォルダになります.

プロジェクトフォルダの中にsrc/ch01フォルダを作成し,以下のhello.hsファイルを作成します.初めてVSCodeでHaskellファイルを作成すると,先ほどインストールしたExtensionsが必要な開発ツールをインストールするか聞いてきますので,全てYesと答えます.

-- src/ch01/hello.hs      (1)
main = do                 (2)
    print "Hello World!"  (3)
1 --以降はコメントとしてコンパイラから無視されます.
2 プログラムが起動すると最初にmain関数が実行されます.
3 画面に出力します.

本書では1行目のコメント行にファイル名を記述することにします.このファイルをghcでコンパイルすると実行ファイルが生成されます.VSCodeのTerminalメニューから「New Terminal」を選び,エディタ下部に開かれた「Terminal」タブのシェルプロンプトに以下を入力します.ただし行頭の$記号はシェルプロンプトなので入力しません.シェルの種類によってはプロンプトが%の場合もあります.

$ ghc src/ch01/hello.hs
[1 of 2] Compiling Main             ( src/ch01/hello.hs, src/ch01/hello.o )
[2 of 2] Linking src/ch01/hello
ld: warning: ignoring duplicate libraries: '-lm'

src/ch01ディレクトリに生成されたhelloが実行ファイルです../src/ch01/helloで起動します.

$ ./src/ch01/hello
"Hello World!"

src/ch01ディレクトリには実行ファイル以外にhello.hihello.oファイルも生成されます.これらはコンパイルの過程で作成される中間ファイルです.コンパイル後は削除して構いません.

1.4. ソースコード内のコメント記述

ソースコード内で--を書くと,それ以降行末までコンパイラから無視されます.複数行のコメントは以下のように{--}で囲みます.

{-
ここはコメントとして無視されます
複数行のコメントが書けます
-}

main = do  -- これ以降もコメントとして無視されます
    print "Hello World!"

1.5. VSCodeからコードを実行する

ghcをインストールした際に一緒にインストールされるrunghcはインタプリタでコードをコンパイルせずに実行することができます.これをVSCodeから呼び出すことで,現在編集中のソースファイルをコンパイルせずに実行することができます.Section 1.2でインストールしたCode Runner extensionを使います.

先ほどのhello.hsファイルをVSCodeで開くと,右上に三角形のRunボタンが表示されます.これを押すとOUTPUTペインに以下のような実行結果が表示されます.

[Running] runghc "/Users/shito/Documents/git-repositories/books/book-ProgrammingInHaskell-Hutton/src/ch01/hello.hs"
"Hello World!"

[Done] exited with code=0 in 0.224 seconds

ここでもし/bin/shrunghcを認識しない場合は,~/.profile~/.ghcup/binへのパスを通す設定を行い,VSCodeを再起動してください.それでもうまくいかない場合は,下記のページを参考に自分の環境に合わせて設定してください.

1.6. 対話型インタプリタ

数学では\(x\)の関数\(f\)は\(f(x)\)と記述しますが,Haskellではf xと書きます.括弧がないのが特徴です.2変数関数\(g(x, y)\)ならHaskellではg x yと書きます.

Haskellに予め用意されている関数はPreludeと呼ばれるモジュールに入っています.括弧を付けない関数呼び出しに慣れるために,Prelude内の関数をいくつか呼び出してみましょう.ちょっとしたコードを試すには対話型インタープリタを使います.ターミナルでghciを起動して,ghci>プロンプトに以下のコードを入力します.

$ ghci
GHCi, version 9.4.8: https://www.haskell.org/ghc/  :? for help
ghci> take 3 "abcdef"   (1)
"abc"
ghci> drop 3 "abcdef"   (2)
"def"
1 takeが関数名.3"abcdef"が関数に渡される引数.最初の3文字を取り出した結果を返す.
2 dropが関数名.3"abcdef"が関数に渡される引数.最初の3文字を取り除いた結果を返す.

先ほどのHello Worldのコードで出てきたprint関数もやはり括弧を付けずに呼び出しました.

ghci> print "Hello World!"
"Hello World!"

対話型インタプリタを終了するにはプロンプトに:quit:qをタイプします.

ghci> :q
Leaving GHCi.

1.7. 本章のまとめ

関数については今後詳しく学びます.今回学んだことをまとめてみましょう.

  • コンパイラghc,インタプリタrunghc,対話型インタプリタghciを使ってコードを動かしました.

  • ソースコードにコメントを記す方法を学びました.

  • VSCodeの編集画面からrunghcを起動してコードを実行させました.

  • Haskell特有の括弧をつけない関数呼び出しについて学びました.

  • Preludeというモジュールに標準で使える関数があることを学びました.

1.8. 練習問題

  1. 対話型インタプリタの起動方法は?

  2. VSCodeで開いているファイルを実行する方法は?

  3. コンパイラの起動方法は?

  4. ソースコード内にコメントを書く方法を2つ挙げてください.

  5. 開発ツール一式のインストールとバージョン管理を行うプログラムの名前は?

  6. Haskellに予め用意されている関数は何というモジュールに入っていますか?