私が好きな実用的な例の1つは、プログラミング言語の世界にあります。OOシステムの型のセットは、限定的で離散的ですが列挙可能ではなく、部分的に順序付けされていますが、完全に順序付けされていません。
問題の部分的な順序はサブタイプの関係<:
です。上限は(C#呼び出しとScalaが呼び出す)上部の型で、下限は下部の型(Scalaの; C#/ Javaには同等の機能がありません)になります。object
Any
Nothing
ただし、型システムのすべての型を列挙する方法はないため、を作成することはできませんinstance Enum Type
。これは明確である必要があります。ユーザーは独自の型を作成できるため、事前に自分が何になるかを知る方法はありません。特定のプログラムのすべてのタイプを列挙できますが、システム全体では列挙できません。
同様に、(サブタイプの特定の合理的な定義によると)<:
は、再帰的、推移的、反対称的ですが、全体ではありません。とは無関係なタイプのペアがあります<:
。(Cat
およびDog
は両方とものサブタイプですAnimal
が、どちらも他方のサブタイプではありません。)
単純なオブジェクト指向言語用のコンパイラーを書いているとしましょう。システムでの型の表現は次のとおりです。
data Type = Bottom | Class { name :: String, parent :: Type } | Top
そして、サブタイピング関係の定義:
(<:) :: Type -> Type -> Bool
Bottom <: _ = True
Class _ _ <: Bottom = False
Class n t <: s@(Class m _)
| n == m = True -- you can't have different classes with the same name in this hypothetical language
| otherwise = t <: s -- try to find s in the parents of this class
Class _ _ <: Top = True
Top <: Top = True
Top <: _ = False
これにより、スーパータイピング関係も得られます。
(>:) :: Type -> Type -> Bool
t >: s = s <: t
また、2つのタイプの最小上限を見つけることもできます。
lub :: Type -> Type -> Type
lub Bottom s = s
lub t Bottom = t
lub t@(Class _ p) s@(Class _ q) =
| t >: s = t
| t <: s = s
| p >: s = p
| t <: q = q
| otherwise = lub p q
lub Top _ = Top
lub _ Top = Top
演習:ショーというType
形式囲まれた完全なposet下の二つの方法、<:
および下>:
。