まあ、パラメトリック性として知られているものは、MLの純粋なサブセット(つまり、無限再帰、ref
およびすべての奇妙なもの)を考えると、空を返すもの以外にこのタイプの関数を定義する方法がないことを示していますリスト。
これはすべて、Wadlerの論文「Theorems for free!」から始まりました。」。このペーパーは、基本的に、2つのことを教えてくれます。
- 特定の条件を満たすプログラミング言語を検討する場合、多態性関数の型シグネチャ(これはパラメトリック性定理と呼ばれます)を調べるだけで、いくつかのクールな定理を推測できます。
- ML(無限再帰なし、
ref
およびすべての奇妙なもの)は、これらの条件を満たす。
Parametricity定理から、我々は我々が機能を持っている場合ことを知ってf : 'a list -> 'b list
、そしてすべてのために'a
、'b
、'c
、'd
およびすべての機能のためにg : 'a -> 'c
、h : 'b -> 'd
私たちは持っています:
map h ∘ f = f ∘ map g
(注意:f
左側にはタイプが'a list -> 'b list
ありf
、右側にはがあり'c list -> 'd list
ます。)
私たちはg
好きなものを自由に選択できるので、'a = 'c
とさせてくださいg = id
。今以来map id = id
(簡単の定義に関する帰納法により証明するためにmap
)、我々は持っています:
map h ∘ f = f
さあ、'b = 'd = bool
そしてh = not
。ある人のためにzs : bool list
それが起こると仮定しましょうf zs ≠ [] : bool list
。成立map not ∘ f = f
しないことは明らかです、なぜなら
(map not ∘ f) zs ≠ f zs
右側のリストの最初の要素がである場合、true
左側の最初の要素はでfalse
あり、その逆も同様です。
これは、私たちの仮定が間違っていることを意味しますf zs = []
。終わりましたか?番号。
私たちは、その仮定'b
ですbool
。私たちは時にあることを示してきたf
タイプで呼び出されたf : 'a list -> bool list
いずれかのために'a
、f
常に空のリストを返す必要があります。それが別のものを返すf
ので、f : 'a list -> unit list
それを呼び出すとそれはそれであることができますか?私たちの直感はこれがナンセンスだと教えてくれます:ブール値のリストを提供したいときに常に空のリストを返し、そうでなければ空でないリストを返す可能性のある関数を純粋なMLで書くことはできません!しかし、これは証拠ではありません。
私たちが言いたいことはつまり、f
ある均一な:それは常にのために空のリストを返す場合bool list
、それはしなければならないため、空のリストを返すunit list
と、一般的には、任意の'a list
。これが、私の回答の冒頭にある箇条書きの2番目のポイントについての説明です。
この論文は、MLでは関連する値を関連する値にするf
必要があることを示しています。私は関係の詳細につもりはない、リストがされていると言うのに十分です関連であれば、彼らは同じ長さを有し、その要素が対に関連している場合にのみ(である、としている場合にのみ場合は関連しているとに関連していますなどに関連しています)。そして、楽しい部分があるため、我々の場合には、ある多型である、我々が定義することができる任意のリストの要素の関係を![x_1, x_2, ..., x_m]
[y_1, y_2, ..., y_n]
m = n
x_1
y_1
x_2
y_2
f
のは、いずれかを選択してみましょう'a
、'b
と見てf : 'a list -> 'b list
。今見てくださいf : 'a list -> bool list
。この場合はf
常に空のリストを返すことはすでに示しました。ここで、のすべての要素が'a
自分自身に関連していると仮定します(必要な任意の関係を選択できることを忘れないでください)。これzs : 'a list
は、いずれかが自分自身に関連していることを意味します。ご存じのように、f
は関連する値を関連する値に取ります。これf zs : 'b list
はに関連していることを意味しますf zs : bool list
が、2番目のリストの長さはゼロに等しく、最初のリストはそれに関連しているため、空です。
完全を期すために、Wadlerの元の論文には、一般的な再帰の影響に関するセクション(終了しない可能性がある)があり、の存在下での自由定理を探究している論文もありseq
ます。