top page > computer > haskell > web_lecture > for_programmer > function_summary.html
更新日:
文責: 重城良国

まとめ: 関数

関数定義

書式

[関数名] [仮引数1] [仮引数2] ... = [値]

foo x y = (x - 1) * y - (x + 3)

試してみる

% ghci
Prelude> let foo x y = (x - 1) * y - (x + 3)

関数の使用

書式

[関数名] [引数1] [引数2] ...

foo 8 5

試してみる

Prelude> foo 8 5
24

多引数関数の正体

Haskellには多引数関数はない。「2引数x, yをとり値zを返す関数のようなもの」は「引数xをとり「引数yをとり値zを返す関数」を返す関数」だ。

試してみる

Prelude> (foo 8) 5
24

foo 8が返した関数に値5をわたす。関数適用は左結合なので丸括弧は省略できる。

高階関数

高階関数とは

のどちらかまたは両方の関数だ。前者は制御構造として使える。後者は多引数関数と考えられる。

twice f x = f (f x)

試してみる

Prelude> let twice f x = f (f x)
Prelude> twice succ 8
10

関数リテラル

書式

\[引数1] [引数2] ... -> [値]

関数定義との関係

関数定義は関数リテラルによる関数の作成と変数束縛の2つを同時にする構文糖だ。

bar = \x y -> (x - 1) * y - (x + 3)

試してみる

Prelude> let bar = \x y -> (x - 1) * y - (x + 3)
Prelude> bar 8 5
24

演算子

演算子は2引数関数だ。中置記法である。演算子は丸括弧で関数に、関数はバッククォートで演算子になる。変換は定義、呼び出しのどちらでも有効だ。

10 `mod` 3

(+) 5 8

試してみる

Prelude> 10 `mod` 3
1
Prelude> (+) 5 8
13

パターンマッチ

パターンマッチによって分岐と値のとりだしができる。

baz (Just x) = x * 2
baz _ = 0

ガード

Bool値へのパターンマッチには特別な構文が用意されている。

qux x
| x <= 0 = 0
| otherwise = x * 2

まとめ

関数の記法や多引数関数は幻であること、パターンマッチやガードによるコードの分岐を学んだ。

「型」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics