칼의 대답은 좋습니다. 다른 사람이 언급하지 않은 추가 용도는 다음과 같습니다. 유형
if E then A else B
유형의 A
모든 값과 유형의 모든 값을 포함하는 유형이어야합니다 B
. 의 유형 경우 B
입니다 Nothing
, 다음의 유형 if
표현의 유형이 될 수 있습니다 A
. 나는 종종 루틴을 선언합니다
def unreachable( s:String ) : Nothing = throw new AssertionError("Unreachable "+s)
코드에 도달하지 않을 것이라고 말하십시오. 그 형태이기 때문에 Nothing
, unreachable(s)
지금 어떤에서 사용할 수 있습니다 if
(더 자주) 또는 switch
결과의 유형에 영향을주지 않고. 예를 들어
val colour : Colour := switch state of
BLACK_TO_MOVE: BLACK
WHITE_TO_MOVE: WHITE
default: unreachable("Bad state")
스칼라는 그러한 유형이 없습니다.
Nothing
(Karl의 답변에서 언급 한) 또 다른 유스 케이스 는 List [Nothing]입니다. 각 멤버의 유형이 Nothing 인 목록 유형입니다. 따라서 빈 목록의 유형이 될 수 있습니다.
Nothing
이러한 유스 케이스를 작동시키는 주요 특성은 스칼라에서는 값이 없지만 값이없는 것이 아니라 다른 모든 유형의 하위 유형이라는 것입니다.
모든 유형에 동일한 값이 포함 된 언어가 있다고 가정 해 봅시다 ()
. 이러한 언어에서 ()
유일한 유형의 단위 유형은 모든 유형의 하위 유형이 될 수 있습니다. 그렇다고 OP가 의미하는 바에 따라 이것이 최하위 유형은 아닙니다. OP는 하위 유형에 값이 없음을 분명히했습니다. 그러나 모든 유형의 하위 유형 인 유형이므로 하위 유형과 거의 동일한 역할을 수행 할 수 있습니다.
하스켈은 약간 다르게 행동합니다. Haskell에서 값을 생성하지 않는 표현식은 유형 체계를 가질 수 있습니다 forall a.a
. 이 유형 체계의 인스턴스는 다른 유형과 통합되므로 (표준) Haskell에 하위 유형 지정 개념이 없더라도 효과적으로 최하위 유형으로 작동합니다. 예를 들어, error
표준 전주곡 의 함수에는 유형 체계가 forall a. [Char] -> a
있습니다. 그래서 당신은 쓸 수 있습니다
if E then A else error ""
표현식의 유형은 A
모든 표현식 의 유형과 동일 합니다 A
.
Haskell의 빈 목록에는 형식 체계가 forall a. [a]
있습니다. A
유형이 목록 유형 인 표현식 인 경우
if E then A else []
와 유형이 같은 표현식입니다 A
.
void
데이터를 정의 할 수 없습니다 .