haskellでの色々な関数定義に触れてみた

関数型言語Haskellでの関数定義について触れてみました。基本の関数定義に限定したため、今回はamazonkaには触れません。
2018.11.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回のエントリー「AWSSDKの選択肢を広げるためにHaskellを始めてみた」に引き続き、関数定義について踏み込んでみました。

実践と検証の反復速度を重視するため、今回はインタプリタに限定しています。

関数について

関数の定義

基本の関数定義は関数名 引数1 引数2 .. 引数n = 式です。

以下は簡単な足し算の式です。

Prelude> calc_plus x y = x + y
Prelude> calc_plus 1 2
3
Prelude> calc_triple_plus x y z = x + y + z
Prelude> calc_triple_plus 1 2 3
6

関数の型

IntやString等、型を明示的に書く場合は以下のようになります。
関数名 :: 引数型1 -> 引数型2 -> ... -> 引数型n -> 返却型

上記の足し算を行う定義に対して明示する場合は以下の流れとなります。

Prelude> :{
Prelude| calc_triple_plus :: Int -> Int -> Int -> Int
Prelude| calc_triple_plus x y z = x + y + z
Prelude| :}
Prelude> calc_triple_plus 1 2 3
6

インタプリタ上にて複数行にまたがって書くため、:{:}を利用しました。

再帰関数

定義した関数の中で関数を呼び出します。

Prelude> :{
Prelude| auto_calc :: Int -> Int
Prelude| auto_calc x =
Prelude|   if x == 5 then x
Prelude|     else auto_calc (x + 1)
Prelude| :}
Prelude> auto_calc 1
5

上記のケースでは、内部呼び出しで引数として渡す際に加算しています。

ラムダ関数

匿名関数や無名関数とも言われています。頭にバックスラッシュを付けた後に関数定義します。 \ 引数1 引数2 ... 引数n -> 定義

Prelude> calc_triple_plus = \ x y z -> x + y + z
Prelude> calc_triple_plus 1 2 3
6

ラムダ関数で前述のcalc_triple_plusを定義する場合は上記のようになります。

まとめ

演算子等の基本的なシンタックスについては他の言語と大きくは異なっていなかったため、関数型言語の主体と思われる関数定義について触れてみました。

尚、このエントリー内での検証については、日本語での記述による読解速度を優先して、Haskellの公式ドキュメントではなくウォークスルー Haskellを参考資料として実践してみました。

インストール済みのamazonkaに触れるため、引き続きimportを利用した手続きにも触れてみようと思います。