ガード (プログラミング)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

ガード (Guard)とは、プログラム内のある分岐で処理を続けるために真 (true)と評価されなければならないブーリアン型である。HaskellCleanErlangoccamOCamlといったプログラミング言語や多くの並行論理プログラミング言語で使われる用語。Mathematica ではガードをconstraintと呼ぶ。ガードは形式手法の言語であるGuarded Command Languageの基本概念でもある。ガードはパターンマッチの能力を強化することができ、たとえ構造がマッチしていてもパターンをスキップさせることが可能である。ブーリアン型の式はif文でも使われていて、ここでのガードの定義にも合致しているが、一般に「条件式」と呼ばれる。

[編集]

以下の Haskell のコード例で、"|" と "=" の間の部分がガードである。

f x
  | x > 0     = 1
  | otherwise = 0

これは、以下の数学的表記法に似ている。


f(x) = \left\{ \begin{matrix} 
               1   & \mbox{if } x>0 \\ 
               0   & \mbox{otherwise} 
               \end{matrix} 
       \right.

この場合、ガードは "if"節と "otherwise"節にある。

上記の例のように複数の並列のガードがある場合、先頭から順に評価され、最初に真となった分岐が選択される。

Haskell のリスト内包表記でのガード列は、1つでも偽であった場合にそのリスト要素が生成されない。これはつまり、個々のガードを論理積で結合したと見なすことができるが、リスト内包表記にはガード以外も列挙される。

発展[編集]

単純な条件式は1963年のCPLに既に存在しており、最初の部分式に対するガードが記述され、その後にガードが偽であった場合の部分式が記述される。例えば以下のように記述される。

(x>0) -> 1/x; 0
x>0 ? 1/x : 0

後半の部分式も条件付きの式として記述できる場合、以下のような記述が可能となる。

(x>0) -> 1/x; (x<0) -> -1/x; 0

1966年のISWIMに既に else 節に相当する部分のない条件付き式があり、ガードと二者択一の概念が分離されている。ISWIM では、どの分岐も真でない場合、全体として式の値は「未定義」とされ、値が計算されないと定義されていた。

1976年のSASLは「ガード」という用語を使った初期のプログラミング言語の1つであり、関数の定義を複数持たせて、ガードによって適用する定義を選択するようになっていた。

fac n = 1,             n = 0
      = n * fac (n-1), n > 0

パターンガード[編集]

パターンガードとは、ガード内でパターンマッチングを行うこと(あるいはそのようなガード)である。この定義は Haskell について Simon Peyton Jones が A new view of guards として1997年4月に提案し、その後実装されている。

Haskell での例を示す。

clunky env var1 var2
  | Just val1 <- lookup env var1
  , Just val2 <- lookup env var2
  = val1 + val2
...other equations for clunky...

ここで、"<-" はパターンガード修飾子と呼ばれ、右辺を評価した結果を左辺とパターンマッチする。リスト内包表記のようにパターンガードを並べることができ、いずれかがパターンマッチに失敗すれば、その分岐は実行されない。

関連項目[編集]

参考文献[編集]