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

値構築演算子

はじめに

値構築子は特殊な関数だ。前置記法である関数に対して中置記法の演算子がある。同じように値構築子に対しても値構築演算子がある。

レクリエーション

ある幼稚園でレクリエーションをする。用意するものは赤、青、黄色の帽子だ。子供達は3色の帽子をわたされ、それぞれ好きな色の帽子をかぶる。そして、保母さんの指示にしたがって帽子を変える。指示は「今かぶっている帽子の色」と「次にかぶる帽子の色」から成る。たとえば「黄色の帽子をかぶっている子は青の帽子をかぶってください」と指示する。

実装

recreation.hs

色つきの帽子

色つきの帽子を表す型を作る。

data Cap = Red | Blue | Yellow deriving Show

% ghci recreation.hs
*Main> Red
Red
*Main> :t Red
Red :: Cap

指示

指示を表す型を作る。

data Order = Change Cap Cap deriving Show

*Main> :reload
*Main> Change Red Blue
Change Red Blue
*Main> :t Change Red Blue
Change Red Blue :: Order

レクリエーション関数

recreation :: Cap -> [Order] -> Cap
recreation c [] = c
recreation Red (Change Red c : os) = recreation c os
recreation Blue (Change Blue c : os) = recreation c os
recreation Yellow (Change Yellow c : os) = recreation c os
recreation c (_ : os) = recreation c os

*Main> :reload
*Main> recreation Blue [Change Red Blue, Change Blue Red, Change Yellow Red, Change Red Yellow]
Yellow

値構築演算子を使う

recreationOp.hs

関数には小文字で始まる識別子を使うのに対して、値構築子には大文字で始まる識別子を使う。同じように、演算子は:以外で始まる記号列を使うのに対して、値構築演算子には:で始まる記号列を使う。

指示

値構築演算子を使う。

data Order = Cap :-> Cap deriving Show

矢印で「変化」の感じを出した。

レクリエーション関数

recreation :: Cap -> [Order] -> Cap
recreation c [] = c
recreation Red (Red :-> c : os) = recreation c os
recreation Blue (Blue :-> c : os) = recreation c os
recreation Yellow (Yellow :-> c : os) = recreation c os
recreation c (_ : os) = recreation c os

*Main> :reload
*Main> recreation Blue [Red :-> Blue, Blue :-> Red, Yellow :-> Red, Red :-> Yellow]
Yellow

まとめ

関数に対して演算子があるように値構築子に対しては値構築演算子がある。値構築演算子は:から始まる記号列だ。値構築演算子を使うことでコードがわかりやすくなることがある。

課題

  1. 同じ文字の連続を文字と整数値で表現する型を作成せよ
  2. 上記の型の値のリストを文字列に変換する関数を作成せよ

「関数としての値構築子」へもどる 「多相型」へ

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