Haskell

Haskellの森を歩く

参考にしたもの

https://haskell.e-bigmoon.com/stack/tips/stack-upgrade.html
https://www.ishiy.xyz/posts/2016-02-28-haskell-docker.html

stack

Haskellのビルドツール

インストール

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

パスを通す

 export PATH=~/.local/bin:$PATH

反対に export PATH=$PATH:~/.local/bin とすると、古い stack を参照してしまうため、注意が必要です。
https://haskell.e-bigmoon.com/stack/tips/stack-upgrade.html

GHCのインストール

stack setup

バージョンの確認

stack --version

アップグレード

stack upgrade

新しいプロジェクトの作成

stack new <project-name>

実行ファイルを作成

stack ghc <file-name.hs>

実行ファイルを作成して~/.local/bin/にインストール

stack install

単体テストの実行

stack test

REPLの実行

プロジェクト内で使うと関連モジュールを自動的に読み込む

stack ghci

Dockerで実行

# プロジェクトを新規作成
stack new hello-docker simple
cd hello-docker

# Dockerの設定
cat << EOF >> stack.yaml
docker
    enable: true
EOF

# イメージをプル
stack docker pull

※ビルドの前にSELinuxをいじる(Fedoraだけ?)

# SELinuxをいじる
su -c "setenforce 0"

動的リンクでビルド

# ビルド
stack build

# 実行
stack exec hello-docker

静的リンクでビルド

# ビルド
stack build --ghc-options='-optl-static -optl-pthread'

# 実行
#stack exec hello-docker

alpineで実行

# alpineをプル
docker pull alpine

# 静的リンクでビルドしたバイナリをコピー
cp hello-docker/.stack-work/install/x86_64-linux-dkda49f7ca9b244180d3cfb1987cbc9743/lts-10.4/8.2.2/bin/hello-docker ./

# ディレクトリ作成 
mkdir haskell-hello-docker
cd haskell-hello-docker

# Dockerfileを作成
cat << EOF > Dockerfile
FROM alpine:latest
COPY hello-docker /usr/bin
CMD sh
EOF

# ビルド
docker build -t haskell-hello-docker .    

# 実行
docker run -it --rm haskell-hello-docker hello-docker   

IHaskell

https://github.com/gibiansky/IHaskell

jupyter notebookでHaskellが使えます

fedora 26 でインストール

依存するライブラリをインストール

# C++
sudo dnf install -y gcc-c++

# C library
sudo dnf install -y \
    libiw.so.29 \
    file-devel \
    blas-devel \
    lapack-devel \
    cairo-devel \
    pango-devel \
    zeromq-devel
curl -sSL https://get.haskellstack.org/ | sh
git clone https://github.com/gibiansky/IHaskell
cd IHaskell
pip3 install -r requirements.txt
stack install gtk2hs-buildtools
stack install --fast
ihaskell install --stack

実行

stack exec jupyter -- notebook