のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

MacでHaskellの環境を構築する

タイトルの通り、ちょっと前にHaskellの環境をMacで構築したので、同じ様なことをする人のためにこの記事を作成する。 基本的には以下のサイトの翻訳のような内容となっている。

docs.haskellstack.org

当ブログからすると「なぜいきなりHaskell?」というという唐突さがあると思うが、これは以下の48時間でHaskellを使ってSchemeのインタプリタを書こう!をやろうとしたから。 これをやる理由はインタプリタを作成することで、よりプログラミング言語の実装について理解を深められると大先輩から助言を頂いたので。

en.wikibooks.org

ツールのインストール編

コンパイラをインストール

以下コマンドをターミナルで実行する。

$ curl https://get-ghcup.haskell.org -sSf | sh

もしくはwgetでもok。

ghcとは?以下wikipediaより

Glasgow Haskell Compiler (グラスゴー・ハスケル・コンパイラ)[4] またはThe Glorious Glasgow Haskell Compilation System (ザ・グロリアス・グラスゴー・ハスケル・コンピレーション・システム)[5] は、関数型プログラミング言語 Haskellのオープンソースコンパイラである。

stackをインストール

$ curl -sSL https://get.haskellstack.org/ | sh

stackとは?参考サイトより

Stack is a cross-platform program for developing Haskell projects. It is aimed at Haskellers both new and experienced.

プラットフォームを横断した開発を可能にするツールのよう、つまりpipとかnpmみたいな類のhaskell版パッケージマネージャのようだ。 pip等と異なる点は、Haskellアプリケーションのプロトタイプアプリケーションを作成できたりすることのようだ。 当然ライブラリのインストールもできるので説明の通り、開発支援ツールなのだと思う。 一応参考のqiitaには詳しく書いてあって、端的に以下ができると説明があった。

  1. Haskell コンパイラをパソコンにインストールする。
  2. Haskell 製のツールを、ビルドしてパソコンにインストールする。
  3. Haskell で開発する際のプロジェクトを新規作成したり、プロジェクトをビルドしたりする。

どうやらstack ghcでもコンパイラインストールできたようだ… 今回は参考の通り進めたので試していないが、stackを活用したプロジェクトならばこちらのほうが良いのかもしれない。 そのうち開発環境を分離する方法も調査してみる。 https://qiita.com/usamik26/items/672ed3c4451402bfc275

プロジェクト構築編

プログラミング言語経験者の方には詳細な説明は不要だろうが、基本的なプロトタイプアプリケーションの流れと大差なく進む。

# デフォルトのアプリ構成を自動生成(my-projectはstack内で保持しているパッケージ名、何でもいいわけではなさそう
$ stack new my-project

もし上記でうまく行かない場合、コンパイラがインストールできていないことで怒られているならば以下でstackでコンパイラをインストールし直す必要があるかもしれない。

# ~/.stack/にコンパイラをインストール
$ stack setup

REPLの使用

以下で、対話型インタプリタを使用できる。

$ stack ghci

生成されるアプリケーションのついて

ディレクトリ構成

└── my-project
    ├── ChangeLog.md
    ├── LICENSE
    ├── README.md
    ├── Setup.hs
    ├── app
    │   └── Main.hs
    ├── my-project.cabal
    ├── package.yaml
    ├── src
    │   └── Lib.hs
    ├── stack.yaml
    ├── stack.yaml.lock
    └── test
        └── Spec.hs

stack.yamlには ここでの実行ファイル(エントリポイント)はapp/Main.hsになる。 これは別に「Main」という名前が重要ではなく、別のファイルで「Main.hsがエントリポイントと指定している」からである。

以下でどのようにしていするのか説明する。

プロジェクトの設定

基本的に上記のpackage.ymlに依存性やエントリポイントの設定が書いてある。 プロトタイプ作成直後はおそらく以下のようになっているはずだ。

name:                my-project
version:             0.1.0.0
github:              "githubuser/my-project"
license:             BSD3
author:              "Author name here"
maintainer:          "example@example.com"
copyright:           "2019 Author name here"

extra-source-files:
- README.md
- ChangeLog.md

# Metadata used when publishing your package
# synopsis:            Short description of your package
# category:            Web

# To avoid duplicated efforts in documentation and dealing with the
# complications of embedding Haddock markup inside cabal files, it is
# common to point users to the README.md file.
description:         Please see the README on GitHub at <https://github.com/githubuser/my-project#readme>

dependencies:
- base >= 4.7 && < 5

library:
  source-dirs: src

executables:
  my-project-exe:
    main:                Main.hs
    source-dirs:         app
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - my-project

tests:
  my-project-test:
    main:                Spec.hs
    source-dirs:         test
    ghc-options:
    - -threaded
    - -rtsopts
    - -with-rtsopts=-N
    dependencies:
    - my-project

いくつか説明すると… - エントリポイント →executableディレクティブで指定する。 my-project-exe→実行コマンド名 main: Main.hsstack exec <実行コマンド名>で実行されるファイル dependncies→別ライブラリのディレクトリ `

  • 別ライブラリのimport方法 → dependenciesディレクティブに加える。

    アプリケーションの実行

# ビルド
$ stack build

# 実行
$ stack exec my-project-exe

最後に

書き終わった後に、すごく充実したhaskell入門記事を見つけた。本気な人はこちらもやろう。

qiita.com

ひとまず今後別の方向に充実させることとしよう…

参考

qiita.com