タイトルの通り、ちょっと前にHaskellの環境をMacで構築したので、同じ様なことをする人のためにこの記事を作成する。 基本的には以下のサイトの翻訳のような内容となっている。
当ブログからすると「なぜいきなりHaskell?」というという唐突さがあると思うが、これは以下の48時間でHaskellを使ってSchemeのインタプリタを書こう!をやろうとしたから。 これをやる理由はインタプリタを作成することで、よりプログラミング言語の実装について理解を深められると大先輩から助言を頂いたので。
ツールのインストール編
コンパイラをインストール
以下コマンドをターミナルで実行する。
$ 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には詳しく書いてあって、端的に以下ができると説明があった。
- Haskell コンパイラをパソコンにインストールする。
- Haskell 製のツールを、ビルドしてパソコンにインストールする。
- 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.hs
→stack exec <実行コマンド名>
で実行されるファイル
dependncies
→別ライブラリのディレクトリ
`
- 別ライブラリのimport方法
→ dependenciesディレクティブに加える。
アプリケーションの実行
# ビルド $ stack build # 実行 $ stack exec my-project-exe
最後に
書き終わった後に、すごく充実したhaskell入門記事を見つけた。本気な人はこちらもやろう。
ひとまず今後別の方向に充実させることとしよう…