nominal, branded, structural, opaque

Jason Kim·2020년 8월 16일
1

nominal typing

C++, Java와 같은 언어들처럼 이름이 다르면 다른 타입으로 인식한다.

structural typing

Haskell, OCaml은 타입의 구분을 이름이 아닌 실제 형태를 참고해서 구분한다. 타입의 이름은 단지 타입구조에 대한 별칭이라고 볼 수 있을 듯.

opaque data type

구체적인 자료 구조(concrete data structure)를 감추고 추상 자료형(abstract data type)을 대신 노출하는 것.

또는 data constructors를 노출시키지 않는 것. 이렇게되면 해당 타입의 값을 패턴매칭 시키거나 명시적으로 생성할 수 없게 된다.

flow는 주로 함수의 인자값이 parsed(refinements 라고도 표현하는듯?)된 값이 사용되게 하기 위해서, swift는 리턴타입이 covariant 가 되도록 하기 위해서 사용하것으로 생각된다.

branded type

typescript에서 nominal, opaque 타입을 구현하기 위한 방법중 하나. (다른 언어에서도 존재하는 개념인지는 모르겠다.) enum, intersection, unique symbol 등을 사용.

참고

https://flow.org/en/docs/lang/nominal-structural/
https://en.wikipedia.org/wiki/Opaque_data_type
https://flow.org/en/docs/types/opaque-types/
https://basarat.gitbook.io/typescript/main-1/nominaltyping
https://twitter.com/rauschma/status/1293752309248397315
https://github.com/gcanti/io-ts/blob/master/index.md#branded-types--refinements
http://1ambda.github.io/haskell/intro-to-haskell-6/#type-declarations
https://codemix.com/opaque-types-in-javascript

[2021/01/27 추가]
https://medium.com/better-programming/nominal-typescript-eee36e9432d2

0개의 댓글