Haskell 入門


ghci で複数行を入力する方法 :{ :} コマンド

ghci で関数の定義をするのに複数行入力したいときがある。:set +m コマンドで複数行入力モードにすることができるが、こんどは1行で定義が済むときにも複数行入力になって煩わしく感じる。こんな時は :{ コマンド と :} コマンドを使えばいいらしい。: が先頭についているのでどちらも ghci のコマンドだ。

:{ コマンド

使い方は簡単で複数行入力したいときに :{ コマンドだけを入力すると複数行入力モードになる。入力が終わったら、複数行入力モード内で :} コマンドだけを入力する。すると、再び1行入力モードになる。複数行で定義された関数は1行モードでちゃんと使える。

Prelude> :{
Prelude| fact 0 = 1
Prelude| fact n = n * fact (n-1)
Prelude| :}
Prelude> fact 5
120

コピベもできる

複数入力モードの時は、エディターから直接にコピペできる。ファイルを作るまではないが、入力ミスしたら再度入力をし直さなければならないときなどに便利だ。

Prelude> :{
Prelude| mymap f [] = []
Prelude| mymap f (x:xs) = (f x) : mymap f xs
Prelude| :}
Prelude> mymap (*10) [1..10]
[10,20,30,40,50,60,70,80,90,100]

ghci を使って部品のテストをしてからプログラムを組むようにしたら、全体が完成しないとテストができないプログラムを作成するのが嫌になる。:{ と :} コマンドはこれからうんと使いそうだ。

Vi を使う

ghci のコマンド :! を使うとシェルコマンドが使える。これを利用してエディタを起動すれば長いプログラムでも編集できる。

Prelude> :! vi foo.hs
Prelude> :! cat foo.hs
fact 0 = 1
fact n = n * fact (n-1)
Prelude> :l foo.hs
[1 of 1] Compiling Main             ( foo.hs, interpreted )
Ok, modules loaded: Main.
*Main> fact 5
120

:set editor コマンド

:set editor コマンドでエディターを指定すれば、:e コマンドでファイルを編集できる。エディタを終了すると、ソースコードがコンパイルされ、エラーがあれば表示されるので、:e コマンドで再編集する。コンパイルが成功すれば、:l コマンドで ghci にロードして実行できる。

~$ ghci
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
Prelude> :set editor vi
Prelude> :e fact.hs
Ok, modules loaded: none.
Prelude> :l fact.hs
[1 of 1] Compiling Main             ( fact.hs, interpreted )
Ok, modules loaded: Main.
*Main> :!cat fact.hs
fact 0 = 1
fact n = n * fact (n-1)
main = print $ fact 5
*Main> fact 5
120