Haskell-制御構文

分岐処理

階乗の計算における分岐処理を複数方法で記述します。


なお、分岐処理の記述形式には「レイアウト」が適用されます。

インデントがより深ければ、それ以前の行の一部となります。

逆にインデントが浅ければ、一連の処理ブロックが終了することを意味します。


if文

「if--then--else」の分岐処理です。


#!/usr/bin/env runghc
 
factorial n = if n == 0 then 1
              else n * factorial(n - 1)

main = print (factorial 5)

case文

「case-of」で値によって処理を振り分けます。

分岐処理は列挙することで追加可能です。

「_(アンダーバー)」は列記されている値以外の全てにマッチします。


#!/usr/bin/env runghc
 
factorial n = case n of
              0 -> 1
              _ -> n * factorial(n - 1)

main = print (factorial 5)

パターンマッチング

Haskellでは同じ型であれば、同じ名前の関数を複数定義することができます。

この場合、記述順が先の関数から順に引数のパターンマッチングを行い、最初にマッチした関数を適応する事になります


#!/usr/bin/env runghc

factorial :: Int -> Int
factorial 0 = 1
factorial n = n * factorial(n - 1)

main = print (factorial 5)

guard(ガード)

記述順が先の関数から順に引数のパターンマッチングを行い、最初にマッチした関数を適応する事になります

分岐処理は列挙することで追加可能です。

otherwiseは列記されている値以外の全てにマッチします。


#!/usr/bin/env runghc

factorial n | n == 0 = 1
            | otherwise = n * factorial(n - 1)

main = print (factorial 5)

反復(ループ)制御

Hakellには、手続き型プログラミング言語のようなforやwhileといったループ制御はありません。

関数型言語としては、再帰を使うことで対処できるように問題を解決していきます。


なお、無理矢理do記法の中のlet文でloopを定義してループ制御を使う方法が可能であるが、これが最良の解決策であるかどうか検討したほうがよいといえます。


関連ページ