私は型理論の概念を探しています。おそらく探求されてきたはずですが、その背後にある名前はわかりません。
product型とsum型、およびHindley-Milner型のシステムを持つMLのような言語について考えてみましょう。OCaml構文を使用します。
2つの異なる値がどのように異なるのか疑問に思っています。
使用する
私のユースケースは、xUnitのようなライブラリに「より明確な」エラーメッセージを書き込むことです。2つの値が等しいことが期待されていたときに異なる場合、これはより明確なより良いメッセージを構築するのに役立ちます。
前:
値が異なります:期待される
{x = [1;2;3;4], y = "a long string"}
、得た{x = [1;2;3;3], y = "a long string"}
後:
値が異なります:位置で
.x[3]
、4、3と予想されます。
(最終的にレンズをより小さな異なる値に構築するため、機能レンズとの関係がある可能性があります)。
製品タイプ
例えば:
type p =
{ x : int
; y : string
}
平等は次のように定義できます。
let equal a b =
equal_int a.x b.x && equal_string a.y b.y
ただし、違いを具体化することもできます。
type delta_p =
| Equal
| Diff_x of int * int
| Diff_y of string * string
let diff_p a b =
if not (equal_int a.x b.x) then
Diff_x (a.x, b.x)
else if not (equal_string a.y b.y) then
Diff_y (a.y, b.y)
else
Equal
(それが再帰的であることを示すためにdelta_int
タイプを定義することは意味があるかもしれませんint * int
)
合計タイプ
合計タイプの場合、異なるコンストラクターまたは異なる値を持つことにより、さらに多くの方法があります。
type s = X of int | Y of string
type ctor_s =
| Ctor_X
| Ctor_Y
type delta_s =
| Equal
| Diff_ctor of ctor_s * ctor_s
| Diff_X of int * int
| Diff_Y of string * string
let diff_s a b = match (a, b) with
| X xa, X xb ->
if equal_int xa xb then
Equal
else
Diff_X (xa, xb)
| (* Y case similar *)
| X _, Y _ -> Diff_ctor (Ctor_X, Ctor_Y)
| Y _, X _ -> Diff_ctor (Ctor_Y, Ctor_X)
このコンセプトの名前は何ですか?これについてどこでもっと知ることができますか?
ありがとう!