Haskellの開発環境構築

先ほど決意表明をしました.

[FP]関数型プログラミングを実践する決意表明

教本である「関数プログラミング実践入門」ではHaskellを扱うので環境構築をしたので,メモと同朋のためにも記録します.

環境

Haskellのインストール

Haskellを使うのに,「Haskell-Platform」というのをインストールします. Haskellのオフィシャルからインストールパッケージをダウンロードします.

Haskell

自分がインストールしたのは,先述したバージョンです.

Vimの環境設定

Vimを普段使いしています.けれども,いわゆる「なんちゃってVimmer」(未満)です. (凝りだすと目的が変わってしまうから,という理由をつけてます;)

ググッて,参考にさせていただいたサイトです.

Aruneko的びぼーろく - [Vim]うまいことHaskellを書いてみたい

NeoBundleの改善による変更のため,一部うまくいきませんでした.内容が被る部分も含めて以下に記録しておきます.

Haskell-Platformをインストールすると,同時にインストールされているcabalというパッケージマネージャ(Rubyでいうところのgem)で,「happy」と「ghc-mod」をインストールします. VimHaskellするのに必要なのが「ghc-mod」だそうです. 「happy」は詳しく調べていないですが,Haskellコンパイルをよしなにしてくれるとか.

$ cabal install happy
$ cabal install ghc-mod

自分は普段(仕事では)オフラインの環境でVimを使っていたりするので,NeoBundleは使っていなかったですが,「とりあえず環境作らなきゃ」なので使用させて頂きました.

$ mkdir -p ~/.vim/bundle
$ git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim

VimHaskellプラグインのインストールをするようNeoBundleを使うのに.vimrcに追記しました. 追記した分だけ晒します. なんちゃってVimmerなので,他と干渉したりとか,設定カブってるとかよくわかりませんが,動作しました.

set nocompatible
filetype plugin indent off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim
endif

call neobundle#begin(expand('~/.vim/bundle/'))
NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'kana/vim-filetype-haskell'
NeoBundle 'eaglemt/ghcmod-vim'
call neobundle#end()

filetype plugin indent on

Haskellの動作確認用コード

Haskellのとりあえずサンプルコードです. 拡張子は「foo.hs」のように「hs」とします.

import Text.Printf

main::IO()
main = do
  printf "Hello World\n"

Haskellを実行してみる(GHCi)

GHCiで実行してみます. GHCは,「Glasgow Haskell Compiler」だそうです.(スコットランド生まれなのでしょうか?ラグビーW杯2015おもしろかったですね) 「i」はインタープリタか,インタラクティブの「i」だと思います.

ターミナルから実行する.

$ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help         
Prelude> :l foo.hs
[1 of 1] Compiling Main             ( foo.hs, interpreted ) 
Ok, modules loaded: Main.                                                      
*Main> main 
Hello World     
*Main> 

インタープリタ中のコマンド

  • :l ファイル名
    Haskellのソースファイルをロードする(loadの「l」)
  • :r
    ロード中のソースファイルをリロードする(reloadの「r」)
  • :q
    ghciを停止する(quitの「q」

「*Main> main」は,ソースに書いたmain関数を実行しています.(という理解を現在時点でしています)

Haskellを実行してみる→できなかった(GHCコンパイラと実行コマンド)

コンパイル,実行,とそれぞれコマンドで実行できるそうです.ですが,現況実行できていません.

$ ghc --make foo

$ ls
foo foo.hs foo.hi foo.o

$ runghc foo

とりあえず,今日はここまで.

(以下,追記@2016-01-10)

先述のVimの環境構築の際にお世話になりましたArunekoさまにコメント頂き,実行することができました. 僕の参考書籍(「関数プログラミング実践入門」)の読みが浅かったです.

Haskellを実行してみる(runghcで実行)

「runghc」はHaskellソースコードスクリプト実行するコマンドです.

$ runghc foo.hs
Hello World!

Haskellを実行してみる(GHCコンパイラを使って実行)

ghc」はHaskellソースコードコンパイルし,実行バイナリを作成します.

$ ghc --make foo
$ ./foo 
Hello World!

やったね!