「ウェイ値は異なる場合があります」のタイプ


8

私は型理論の概念を探しています。おそらく探求されてきたはずですが、その背後にある名前はわかりません。

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)

このコンセプトの名前は何ですか?これについてどこでもっと知ることができますか?

ありがとう!


2
ジッパーは場所を「ポインタ」です。ファスナーをユーザーにうまく見せるための方法を研究した人がいるかどうかはわかりません。
Andrej Bauer

それは一般的には議論されていませんが、ユースケースは私が左からの眺め、セクション7を思い出させます。図15には、ユースケースに類似したIsntタイプがあります。
Max New

ポインタをありがとう。ジッパーは、フォーカスよりも左右に「動く」ことを重視しているように見えますが、それも効果があるのです。それは確かにビューパターンにかなり関連しているようです。
エティエンヌミロン2017

回答:


9

あなたは反統一の型付けされた変形を探していると思います。反統一は次のように説明できます。まず、次のような用語の文法があるとします。

t ::= () | (t, t) | C t | X 

ここで、ユニットとペア()(t, t)示します。これは、C t先行コンストラクタをX持つ項であり、任意の項の代わりに使用できる項変数です。

あなたは二つの用語を与えれば抗統一の問題は、言うt1t2、少なくとも一般的な用語である何tの置換が存在するようs1s2するように、s1(t) = t1s2(t) = t2

具体的な例として、2つの用語が与えられた

t1 = Cons(3, Cons(2, Cons(1, Nil)))
t2 = Cons(1, Cons(2, Cons(3, Nil)))

反統一アルゴリズムは反統一を返します

t = Cons(X, Cons(2, Cons(Y, Nil)))

代替品s1 = [X:3, Y:1]s2 = [X:1, Y:3]適用して適用するtt1t2戻ってきます。余談ですが、以下の理由により、「最も一般的でない」を指定する必要がありました。

t' = Z 

置換s1 = [Z:t1]s2 = [Z:t2]、トリックを行います。

gen Terメートル×TerメートルVar

antiunify ()       ()         = ()
antiunify (t1, t2) (t1', t2') = (antiunify t1 t1', antiunify t2 t2')
antiunify (C t)    (C t')     = C (antiunify t t')
antiunify t        t'         = gen(t, t') -- default: t and t' dissimilar 

2個の置換戻すには、このアルゴリズムを増強s1し、s2運動としてのI休暇を。


言葉をありがとう(しゃれ意図)。それはそれかもしれないようです。このような「パス」の型付けされた代数は素晴らしいでしょう。ありがとう!
エティエンヌミロン2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.