내가 좋아하는 한 가지 실제적인 예는 프로그래밍 언어의 세계에서 온 것입니다. OO 시스템의 유형 집합은 경계가 있고 별개이지만 열거 할 수 없으며 부분적으로 정렬되었지만 완전히 정렬되지 않았습니다.
문제의 부분 순서는 하위 유형 관계 <:
입니다. 그러면 상한이 최상위 유형 (C # 호출 object
및 스칼라 호출 Any
)이되고 하한이 최하위 유형이됩니다 (Scala 's Nothing
; C # / Java는 이에 해당하지 않음).
그러나 형식 시스템의 모든 형식을 열거 할 수있는 방법이 없으므로를 쓸 수 없습니다 instance Enum Type
. 명확해야합니다. 사용자는 자신의 유형을 작성할 수 있으므로 미리 어떤 것을 알 수있는 방법이 없습니다. 주어진 프로그램에서 모든 유형을 열거 할 수 있지만 전체 시스템에서는 그렇지 않습니다.
마찬가지로 (하위 유형의 특정 합리적인 정의에 따라) <:
반사, 전이 및 비대칭이지만 총체는 아닙니다 . 와 관련이없는 유형의 쌍이 있습니다 <:
. ( Cat
및 의 하위 유형이지만 둘 Dog
다의 하위 유형이 Animal
아닙니다.)
간단한 OO 언어 용 컴파일러를 작성한다고 가정하십시오. 시스템의 유형 표현은 다음과 같습니다.
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
또한 두 가지 유형 중 최소 상한을 찾을 수 있습니다.
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
형성 함을 보여줍니다 .<:
>: