は は は は haskell

Haskell とは

  • 純粋関数型のプログラミング言語
    • 変数を扱わないため状態という概念がない
  • 非正格の遅延関数言語
  • 強力な型システム
  • 名前は数学者であり論理学者であるハスケル・カリーに由来

実行環境

http://haskell.org/hugs/ から Hugs を導入するのが楽ちんです。Windows 用の WinHugs をインストールすると以下のような環境で対話的にプログラミングが可能になります。

そのほか、コンパイラーが必要な場合には Glasgow Haskell Compiler があります。


Hugs で Help を表示させてみると以下となります。

Hugs> :?
LIST OF COMMANDS:  Any command may be abbreviated to :c where
c is the first character in the full name.

:load <filenames>   load modules from specified files
:load               clear all files except prelude
:also <filenames>   read additional modules
:reload             repeat last load command
:edit <filename>    edit file
:edit               edit last module
:module <module>    set module for evaluating expressions
<expr>              evaluate expression
:type <expr>        print type of expression
:?                  display this list of commands
:set <options>      set command line options
:set                help on command line options
:names [pat]        list names currently in scope
:info <names>       describe named objects
:browse <modules>   browse names exported by <modules>
:main <aruments>    run the main function with the given arguments
:find <name>        edit module containing definition of name
:cd dir             change directory
:gc                 force garbage collection
:version            print Hugs version
:quit               exit Hugs interpreter

まずは、:load、:reload、:type、:quit ぐらいで問題ないです。:load は :l のように短縮コマンドが利用できます。

ごく簡単な例

Husg 上で足し算

Hugs> 2 + 3
5

リストから先頭の要素を取得

Hugs> head[1,2,3,4]
1

リスト要素の和

Hugs> sum[2,3,4]
9

簡単な関数の定義

Hugs 上では関数定義などが行えないため、関数を定義するには sample.hs などのファイルにプログラムを記載して、「:l sample.hs」のようにファイルをロードして Hugs に関数を読み込ませる必要があります。
WinHugs 上にファイルをドロップすると勝手に :load してくれるので楽です。けどパスに日本語が含まれているとうまくいかないです。

sample.hs に以下の関数を定義します。

double x = x + x
triple x = x * 3

double という名前の関数と、triple という名前の関数を定義しました。

Hugs 上で以下のようにすると定義した関数が実行できます。

Hugs> :load "C:\\sample.hs"
Main> double 2
4
Main> triple 2
6

もう少し込み入った例

先ほどの sample.hs に以下の関数を定義してみます。

qsort[] = []
qsort(x:xs) = qsort smaller ++ [x] ++ qsort larger
    where
        smaller = [a | a <- xs, a<= x]
        larger  = [b | b <- xs, b > x]

Husg でファイルをりロードして qsort 関数を呼び出すと、

Main> :r "C:\\sample.hs"
Main> qsort[4,7,8,2,6,0,9,1,3,5]
[0,1,2,3,4,5,6,7,8,9]

クイックソートプログラムの完成です。エレガントだとは思いませんか?

Haskell の予約語

こんなもんです。関数名や引数名には利用できません。

case       class      data     default    deriving
do         else       if       import     in
infix      infixl     infixr   instance   let
of         module     newtype    then     type
where

コメント

一行コメントは「-- 」で始まり行末まで。複数行コメントは「{-」で始まり、「-}」までとなり、コメントは入れ子にできます。

レイアウト規則

Haskell ではブレースとセミコロンにてプログラム構造をあらわすことができますが、通常はインデントによるレイアウト揃えにてブロック構造を表します。キーワード where、let、do、of の後の構造はインデントすることでブレースを省略して記述できます。
前述のクイックソートの例では、smaller と larger が where 節のブロックに含まれることになります。

qsort[] = []
qsort(x:xs) = qsort smaller ++ [x] ++ qsort larger
    where
        smaller = [a | a <- xs, a<= x]
        larger  = [b | b <- xs, b > x]

where 節は関数内にて where の次で定義した関数が利用できるため、smaller と larger はいずれも qsort 関数に属する形となります。

ブレースで表すと、以下のようにも記載できます。

    ・・
    where
      { smaller = [a | a <- xs, a<= x];
        larger  = [b | b <- xs, b > x] }


blog1.mammb.com
に続く