19
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GHCiの基本的な使い方まとめ

Last updated at Posted at 2020-04-02

HaskellコンパイラのGHCに付属する対話形式のコンパイラ、GHCiの基本的な使い方です。さらに詳しいドキュメントは、Haskell.jp1公式ドキュメントを参照してください。この記事を書くにあたって使ったGHCのバージョンは8.6.5です。

起動

GHCiにパスが通っていれば、ghciとコマンドラインに叩くだけで起動できます。

λ> ghci
GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
Prelude>

Haskellの式は、1行づつ実行できます。

Prelude> putStrLn "Hello"
Hello
Prelude> let x = 3
Prelude> x ^ x
27

GHCiの終了

:quitまたは:qで終了します。

Prelude> :q
Leaving GHCi.
λ>

関数、型、型クラス名の補完

GHCiでは、関数などの名前をタブで補完してくれます。何も入力しないでタブを押すと、使用できる関数などを全て出力します。

Display all 510 possibilities? (y or n)
!!                              Prelude.exp                     atan2
$                               Prelude.exponent                atanh
$!                              Prelude.fail                    break
...
Prelude> a<tab>
abs         acosh       and         appendFile  asin        atan        atanh
acos        all         any         asTypeOf    asinh       atan2

複数行の入力

:{を入力して改行すると、複数行での入力が可能です。評価する際は:}で閉じられます。

Prelude> :{
Prelude| add :: Int -> Int -> Int
Prelude| add x y = x + y
Prelude| :}
Prelude> add 4 18
22

.hsファイルのロード

Haskellのソースコードは、:load(:l)でロードできます。

-- ./main.hs
fact :: Int -> Int
fact 0 = 1
fact n = n * fact (n-1)

main = do
	putStrLn "Hello from a script!"
Prelude> :load main.hs
[1 of 1] Compiling Main             ( main.hs, interpreted )
Ok, one module loaded.
*Main>

ファイルの中で定義した関数(型/型クラス/変数など)は、GHCi内で使用できます。

*Main> fact 5
120
*Main> main
Hello from a script!

他ディレクトリへの移動

カレントディレクトリの下層ディレクトリにファイルがある場合は、cdで移動できます。

Prelude> :cd dir
Prelude> 

外部モジュールのインポート

import文が使えますが、:moduleでもインポートできます。

Prelude> import Data.List
Prelude Data.List> 
Prelude> import Data.Map as Map
Prelude Map>
Prelude> :m Data.List
Prelude Data.List>
Prelude> :m +Data.Map
Prelude Data.Map>

モジュール、ファイルのアンロード

:mでモジュール名の前に+をつけるとロードできますが、-でアンロードできます。

Prelude Data.List> :m -Data.List
Prelude>
*Main> :m -Main
Prelude>

ファイルの再読み込み

元のファイルが変更されている場合は、:reload(:r)でリロードできます。

*Main> :r
Ok, one module loaded.
*Main>

環境の確認

:showで、

  • 束縛の一覧
  • モジュールの一覧
  • インポートの一覧

などを見られます。

Prelude> :show bindings
x :: Num p => p = _
f :: p -> p = _
Prelude Data.List> :show modules
Main             ( main.hs, interpreted )
Shapes           ( Shapes.hs, interpreted )
Prelude Data.List> :show imports
import Data.List
import Prelude -- implicit

式や関数の型の確認

:typeまたは:tで式の型(式が持つ値の型)や関数の型注釈を確認できます。

Prelude> :t 3142
3142 :: Num p => p
Prelude> :t 'a'
'a' :: Char
Prelude> :t "aaa"
"aaa" :: [Char]
Prelude> :t Just 181
Just 181 :: Num a => Maybe a
Prelude> :t pred
pred :: Enum a => a -> a

ただし、+などの中置演算子は()で囲まないとエラーが発生します。

Prelude> :t +

<interactive>:1:1: error: parse error on input +
Prelude> :t (+)
(+) :: Num a => a -> a -> a

型などについての情報の確認

:info(:i)で、その関数(型)が属する型クラス、型クラスであればインスタンス、そしてそれらが定義されているモジュールを確認できます。

Prelude> :i map
map :: (a -> b) -> [a] -> [b]   -- Defined in ‘GHC.Base’
Prelude> :i Num
class Num a where
  (+) :: a -> a -> a
  (-) :: a -> a -> a
  (*) :: a -> a -> a
  negate :: a -> a
  abs :: a -> a
  signum :: a -> a
  fromInteger :: Integer -> a
  {-# MINIMAL (+), (*), abs, signum, fromInteger, (negate | (-)) #-}
        -- Defined in ‘GHC.Num’
instance Num Word -- Defined in ‘GHC.Num’
instance Num Integer -- Defined in ‘GHC.Num’
instance Num Int -- Defined in ‘GHC.Num’
instance Num Float -- Defined in ‘GHC.Float’
instance Num Double -- Defined in ‘GHC.Float’

カインドの確認

:kind(:k)で型コンストラクタや型、型クラスのカインド2を確認できます。

Prelude> :k Int
Int :: *
Prelude> :k Maybe
Maybe :: * -> *
Prelude> :k Functor
Functor :: (* -> *) -> Constraint
Prelude> :k Either
Either :: * -> * -> *
Prelude> :k []
[] :: * -> *
Prelude> :k ()
() :: *

プラグマの設定

:set <option>でプラグマを設定できます。

Prelude> f = (+2)
Prelude> f = (+3)
Prelude> :set -Wall -- {-# OPTIONS_GHC -Wall #-} と同義
Prelude> f = (+2)

<interactive>:4:1: warning: [-Wname-shadowing]
    This binding for f shadows the existing binding
      defined at <interactive>:2:1

その他のよく使うコマンド

コマンド 処理
: 1つ前のコマンドを実行
:?(:help) 全てのコマンドを表示
:doc <name> モジュールなどのドキュメントを表示
:browse モジュール内の関数を型注釈とともに一覧で表示
:edit ロードしたファイルを編集
:set editor <path> 編集する際のエディタをパスで設定
  1. ここで翻訳されているGHC Users GuideのGHCのバージョンは8.2.2です。GitHubから翻訳に参加できます。

  2. カインドについてはこちらのページを参照してください。

19
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?