ガード (プログラミング)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/04/07 06:06 UTC 版)
例
以下の Haskell のコード例で、"|" と "=" の間の部分がガードである。
f x
| x > 0 = 1
| otherwise = 0
これは、以下のような、数学で使われる記法に似ている。
この場合、ガードは "if"節と "otherwise"節にある。
上記の例のように複数のガードがある場合、先頭から順に評価され、最初に真となった分岐が選択される。
Haskell のリスト内包表記でのガード列は、1つでも偽であった場合にそのリスト要素が生成されない。これはつまり、個々のガードを論理積で結合したと見なすことができるが、リスト内包表記にはガード以外も列挙される。
言語
ガードのような機能を持つ言語として、Haskell、Clean、Erlang、occam、OCamlといったプログラミング言語や多くの並行論理プログラミング言語が挙げられる。Mathematicaではガードをconstraintと呼ぶ。形式手法の言語であるGuarded Command Language(詳細は歴史の節で後述)でも重要な構成要素である。
パターンガード
パターンガードとは、ガード内でパターンマッチングを行うこと(あるいはそのようなガード)である。この定義は Haskell についてサイモン・ペイトン・ジョーンズが 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...
ここで、"<-" はパターンガード修飾子と呼ばれ、右辺を評価した結果を左辺とパターンマッチする。リスト内包表記のようにパターンガードを並べることができ、いずれかがパターンマッチに失敗すれば、その分岐は実行されない。
- ^ ないし、真 (true) として扱われる値(言語により異なる)でなければならない
- ^ Dijkstra, E.W.: Guarded commands, nondeterminacy and formal derivation of programs. Commun. ACM 18 (1975), 8: 453–457.
- ^ 初出は1972年となっているが、何度か更新している。
- 1 ガード (プログラミング)とは
- 2 ガード (プログラミング)の概要
- 3 歴史
- 4 参考文献
- ガード (プログラミング)のページへのリンク