関係代数(3)

Template Haskell でコード生成を行うようにしたので、関係演算の実装に戻る。

project 演算は、集合に対する演算と見なせば以下のように単純に実装できる。

project :: (Eq a, Eq b) => (a -> b) -> R a -> R b
project f (R s) = R (S.map f s)

実例は以下の通り。

>>> :t suppliers
suppliers :: R (T4 SNO NAME Integer [Char])
>>> project (\ (T4 x y _ _) -> T2 x y) suppliers
SNO:THRelational.SNO SNAME:THRelational.NAME
--------------------------------------------
S1 Smith
S2 Jones
S3 Blake
S4 Clark
S5 Adams

Tutorial D では、もっと簡潔に SUP { SNO, SNAME} と書ける。