てきとうなメモ

本の感想とか技術メモとか

Haskellの勉強 (2) - ghciをもう少し使ってみる

起動

$ ghci
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.4.1, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base-1.0 ... linking ... done.

ヘルプ

Prelude> :help
 Commands available from the prompt:

   <stmt>                      evaluate/run <stmt>
   :add <filename> ...         add module(s) to the current target set
   :browse [*]<module>         display the names defined by <module>
   :cd <dir>                   change directory to <dir>
   :def <cmd> <expr>           define a command :<cmd>
   :help, :?                   display this list of commands
   :info [<name> ...]          display information about the given names
   :load <filename> ...        load module(s) and their dependents
   :module [+/-] [*]<mod> ...  set the context for expression evaluation
   :reload                     reload the current module set

   :set <option> ...           set options
   :set args <arg> ...         set the arguments returned by System.getArgs
   :set prog <progname>        set the value returned by System.getProgName

   :show modules               show the currently loaded modules
   :show bindings              show the current bindings made at the prompt

   :type <expr>                show the type of <expr>
   :kind <type>                show the kind of <type>
   :undef <cmd>                undefine user-defined command :<cmd>
   :unset <option> ...         unset options
   :quit                       exit GHCi
   :!<command>                 run the shell command <command>

 Options for ':set' and ':unset':

    +r            revert top-level expressions after each evaluation
    +s            print timing/memory stats after each evaluation
    +t            print type after evaluation
    -<flags>      most GHC command line flags can also be set here
                         (eg. -v2, -fglasgow-exts, etc.)

終了

Prelude> :quit

またはCtrl-d

数値

整数,浮動小数点数

Prelude> 42
42
Prelude> 3.14
3.14
Prelude> 0xFF
255

演算

Prelude> 1+1
2
Prelude> 2-1
1
Prelude> 2*3
6
Prelude> 4/2
2.0
Prelude> 2 ^ 10
1024

文字

文字はC言語みたく''で囲む

Prelude> 'a'
'a'

文字列

文字列は""で囲む

Prelude> "Haskell"
"Haskell"

文字列の連結

Prelude> "Hello" ++ ", " ++ "World"
"Hello, World"

真偽値

TrueとFalseがある.

Prelude> True && False
False
Prelude> True || False
True
Prelude> not True
False

リスト

リストは[]で囲む

Prelude> [0, 1, 2, 3]
[0,1,2,3]

文字列は実は文字のリストである.

Prelude> ['H', 'a', 's', 'k', 'e', 'l', 'l']
"Haskell"

インデクシングは!!で行う.

Prelude> "Haskell" !! 2
's'

':'でリストの最初と残りの部分を表現できる

Prelude> 1:2:[]
[1,2]

リストの要素は同じ型でなければならない.

Prelude> [0, 'a', True]

<interactive>:1:9:
    Couldn't match `Char' against `Bool'
      Expected type: Char
      Inferred type: Bool
    In the list element: True
    In the definition of `it': it = [0, 'a', True]

タプル

異なる型を含むことのできるリストみたいなもの.()で囲む.

Prelude> (42, "haskell", True)
(42,"haskell",True)

':type'で型を調べる.

Prelude> :type 42
42 :: (Num t) => t
Prelude> :type 'a'
'a' :: Char
Prelude> :type True
True :: Bool
Prelude> :type "Haskell"
"Haskell" :: [Char]
Prelude> :type [0, 1, 2]
[0, 1, 2] :: (Num a) => [a]
Prelude> :type (42, "Haskell", True)
(42, "Haskell", True) :: (Num a) => (a, [Char], Bool)

'(Num t) =>'というのは「数値(Num)であるtに対して」ぐらいの意味.型を表現するときも
リストは'[]'で囲み,タプルは'()'で囲む.

ファイルの読み込み

:load sample.hs

でsample.hsを読み込む.

モジュールの読み込み

:module hoge

hogeを読み込む.

Charモジュールを読み込むと,文字列処理関数を利用できる.

Prelude> :module Char
Prelude Char> isAlpha '1'
False
Prelude Char> isAlpha 'a'
True
Prelude Char> toUpper 'a'
'A'

省略形

今まで紹介してきたコマンドは省略形で呼び出すことができる.

:h[elp]
:l[oad] filename
:m[odule] module
:q[uit]
:t[ype] exp