4. toDB : ∀T, Convertible T → T → DB
fromDB : ∀T, Convertible T → DB → Result T
データ変換のモデル
T : 変換元の型
DB : データベース上の型
Result T : 返り値の型
DB
T Result T
toDBT fromDBT
返り値の型が T でないのは
全てのDB型をT型に
変換できないため
5. toDB : ∀T, Convertible T → T → DB
fromDB : ∀T, Convertible T → DB → Result T
データ変換のモデル
T : 変換元の型
DB : データベース上の型
E + T : 返り値の型
DB
T
toDBT fromDBT
返り値の型が T でないのは
全てのDB型をT型に
変換できないため
E + T
Result T の実装の多くは
適当な型Eに対するE + T 型
6. toDB : ∀T, Convertible T → T → DB
fromDB : ∀T, Convertible T → DB → Result T
f : ∀T, T →
データ変換のモデル
T : 変換元の型
DB : データベース上の型
Result T : 返り値の型
任意の で は単射
T fT
Result T
DB
T Result T
fT
toDBT fromDBT
7. toDB : ∀T, Convertible T → T → DB
fromDB : ∀T, Convertible T → DB → Result T
f : ∀T, T →
データ変換のモデル
T : 変換元の型
DB : データベース上の型
E + T : 返り値の型
は自然な単射
f
E + T
DB
T E + T
fT
toDBT fromDBT
E : 適当な集合
8. toDB : ∀T, Convertible T → T → DB
fromDB : ∀T, Convertible T → DB → Result T
データ変換のモデル
T : 変換元の型
DB : データベース上の型
Result T : 返り値の型
DB
T Result T
fT
toDBT fromDBT f : ∀T, T →
任意の で は単射
T fT
Result T
仕様:∀T, Convertible T → fromDBT ∘ toDBT = fT
9. DB
T
toDBT
toDB : ∀T, Convertible T → T → DB
データ変換の実装
Convertible T
T : 変換元の型
DB : データベース上の型
instance
13. toDB : ∀T, Convertible T → T → DB
fromDB : ∀T, Convertible T → DB → Result T
データ変換のモデル
T : 変換元の型
DB : データベース上の型
Result T : 返り値の型
DB
T Result T
fT
toDBT fromDBT
仕様:∀T, Convertible T → fromDBT ∘ toDBT = fT
f : ∀T, T →
任意の で は単射
T fT
Result T
14. toDB : ∀T, Convertible T → T → DB
fromDB : ∀T, Convertible T → DB → Result T
データ変換のモデル
T : 変換元の型
DB : データベース上の型
Result T : 返り値の型
DB
T Result T
fT
toDBT fromDBT f : ∀T, T →
任意の で は単射
T fT
Result T
単射
仕様:∀T, Convertible T → fromDBT ∘ toDBT = fT
15. toDB : ∀T, Convertible T → T → DB
fromDB : ∀T, Convertible T → DB → Result T
データ変換のモデル
T : 変換元の型
DB : データベース上の型
Result T : 返り値の型
DB
T Result T
fT
toDBT fromDBT f : ∀T, T →
任意の で は単射
T fT
Result T
単射
仕様:∀T, Convertible T → fromDBT ∘ toDBT = fT
16. データ変換の実装
toDB Nothing = Null
Convertible t => Convertible (Maybe t)
toDB x = Nullになる
可能性がある
toDB (Just Nothing) = Null
Convertible (Maybe (Maybe Int))
DB
Maybe T
toDBMaybe T
⟼
Nothing
Just x ⟼
Null
toDB x
単射
instance
18. 実はHaskellでも…
print $ map toJSON s
where
s :: [Maybe (Maybe Int)]
s = [Nothing, Just Nothing, Just (Just 3)]
HaskellのJSONへの変換も先ほどと同じ実装なので…
[Null, Null, Number 3.0]
実行結果
(Data.Aeson 1.6.0.0)
21. Maybe T
解決策1
1 + T
プログラム 数学
ただし 1 = {∅}
Either E T E + T
Either型に帰着
22. DB
Either E T
toDBEither E T
解決策1
⟼
Left e
Right t ⟼
(“Left”, toDB e)
(“Right”, toDB t)
(Convertible e, Convertible t) =>
Convertible (Either e t)
instance
Either型に帰着
31. 解決策2
instanceを変更
Convertible T NNConvertible T
toDB : ∀T, Convertible T → T → DB
data DB = DBBool Bool
| DBInt Int
| DBArray [DB]
| DBNull
⋮
data NNDB = NNDBBool Bool
| NNDBInt Int
| NNDBArray [DB]
⋮
toNNDB : ∀T, NNConvertible T → T → NNDB
32. 解決策2
instanceを変更
Convertible T NNConvertible T
toDB : ∀T, Convertible T → T → DB
data DB = DBBool Bool
| DBInt Int
| DBArray [DB]
| DBNull
⋮
data NNDB = NNDBBool Bool
| NNDBInt Int
| NNDBArray [DB]
⋮
toNNDB : ∀T, NNConvertible T → T → NNDB
33. 解決策2
instanceを変更
Convertible T NNConvertible T
toDB : ∀T, Convertible T → T → DB
data DB = Maybe NNDB data NNDB = NNDBBool Bool
| NNDBInt Int
| NNDBArray [DB]
⋮
toNNDB : ∀T, NNConvertible T → T → NNDB
null = Nothing :: Maybe NNDB
35. 解決策2
instanceを変更
NNConvertible T
data NNDB = NNDBBool Bool
| NNDBInt Int
| NNDBArray [DB]
⋮
Convertible T
Just : NNDB → DB
∀T, NNConvertible T → Convertible T
toDBT := Just ∘ toNNDBT
data DB = Maybe NNDB
36. 解決策2
instanceを変更
NNConvertible T
data NNDB = NNDBBool Bool
| NNDBInt Int
| NNDBArray [DB]
⋮
Convertible T
Just : NNDB → DB
data DB = Maybe NNDB
∀T, NNConvertible T → Convertible (Maybe T)
37. 解決策2
instanceを変更
∀T, NNConvertible T → Convertible (Maybe T)
DB
Maybe T
toDBMaybe T
Nothing Nothing
⟼
Just t ⟼ Just (toNNDB t)
Nullになり得ない
toDBMaybe T := fmapMaybe toNNDBT
fmap : ∀F, Functor F → ∀A B, (A → B) → F A → F B
38. 解決策2
instanceを変更
Convertible T : Nullableデータに変換可能
NNConvertible T : Nullを許さないデータに変換可能
toDBMaybe T := fmapMaybe toNNDBT DB
Maybe T
toDBMaybe T
Nothing Nothing
⟼
Just t ⟼ Just (toNNDB t)
instance
NNConvertible t => Convertible (Maybe t)
40. fromDB
DB
T Result T
fT
toDBT fromDBT
単射
の単射性により
toDBT
を満たす
の存在性が言える
fromDBT ∘ toDBT = fT
fromDBT
かつ選択公理を仮定すると
(Result T = ∅ → DB = ∅)
に関して
fromDB
先ほど定義した に対する
も構成的に定義できる
toDB
fromDB