リフトとは?

C# の仕様に「リフト」って言葉が出てくるのを知ってますか? null 許容型にリフト変換やリフト演算子という名前が出てきます。今日はその「リフト」のトリビア。ここまでだけでも十分トリビアの気もするけどw この名前、まず聞くことないし(^^;
VisualStudio2005 をお持ちなら日本語の C# 仕様書が付いてるので「24章 null 許容型」を参考にどうぞ。
で、そのリフトって言葉の使い方が実は間違ってるって話が C# チームの Eric Lippert さんの blog にあります。間違ってリフトじゃないものをリフトと呼んでたり、リフトなのにリフトと呼んでいなかったりと、めちゃくちゃだそうです。blog の中ほどでリフトがなんなのか説明してあるけど、以前読んだ時はピンとこなくて、フーンで終わってました。
それが、最近読んでる本に唐突にリフトの図が出てきて、図を見たら「なるほどリフトだ!」と納得してしまったのでご紹介。

この図を見ると、nullを一番下にくっつけてグイっと持ち上げてるのが一目で理解できますね。なるほどリフトだと納得しました。

「集合Dに、Dに含まれていない新しい要素⊥を付け加えた集合をD⊥と表す。⊥は最も小さい要素(最小元)。このとき、D⊥をDのリフトと呼ぶ。」のような定義が載ってました。正確には完備半順序集合(cpo)Dにどうたらこうたらって話なんだけど、まあそれはおいときます(^^;
この図はハッセ図といって、半順序集合とかハッセ図とかの説明はこちらがわかりやすいです。興味のある方はどうぞ。

でも、エリックさんの言う lifted function については記述がなかったので、エリックさんの書いてることが正しいのかどうかまではよくわからず…。

参考にした文献:isbn:4320026578 (入手困難なので図書館でどうぞ)



おまけ。エリックさんの書いてることがややこしいので、整理してみた。

  • 1) 誤ってリフトと呼ばれている 等値演算子、関係演算子 == != < <= > >=
  • 2) 正しくリフトと呼ばれている 単項演算子 + ++ - -- ! ~
  • 3) 正しくリフトと呼ばれている 二項演算子 + - * / % & | ^ << >>
  • 4) 正しくリフトと呼ばれている リフト変換
  • 5) null許容変換 (ビルトインの変換)
  • 5.1) 誤ってリフトと呼ばれていない。正しくはリフト。 S?→T?
  • 5.2) リフトと呼ばれていない。正しい。 S→T?
  • 5.3) リフトと呼ばれていない。正しい。 S?→T