ReScript만의 유니크한 Variant!

  • Variant에 대해서는 여러번 나왔었는데요, 오늘은 한번 제대로 다뤄보고자 합니다. 라고 하고 공식문서 번역

  • Variant는 한마디로 한 타입에 대해서, 이거 아니면 저거의 형식을 취하게 해주는 자료 구조입니다.

type myResponse =
  | Yes
  | No
  | PrettyMuch

let areYouCrushingIt = Yes
  • 위의 표현이 JS로 변환되면
var areYouCrushingIt = /* Yes */0;
  • 이렇게 됩니다. 즉, myResponse라는 타입은 Yes, No, PrettyMuch 세 타입중 하나를 가질 수 있고, areYouCrushingIt은 Yes 타입인 것이죠. 이까지는 이게 뭔가? 싶을 수 있습니다. 다음 예시에선 constructor argument를 가지는 variant가 나옵니다.
type account = 
| None
| Instagram(string)
| Facebook(string, int)

let myAccount = Facebook("harold", 21)
let yourAccount = Instagram("Gunners")
  • 이렇듯 argument가 바로 붙어서 나오는 variant 타입도 정의할 수 있다~ 하지만 Variant의 진정한 멋은 아래와 같은 곳에서 나옵니다.

  • 예를 들어, 어떤 array가 존재하는데 그 array에 여러 타입을 담고 싶다면 어떻게 할까요? Java와 같은 언어에서라면 array를 조상 타입 혹은 그보다 훨씬 부모인 object 타입으로 정의한 후 polymorphism을 사용할 수도 있겠습니다만, ReScript에서는 Variant로 멋지게 해결할 수 있습니다. 아래처럼요.

type superType = FirstType(int)| SecondType(string)

type testArray = {
    types: array<superType>
}
  • testArray는 superType을 배열로 갖는 레코드입니다. 그럼 이제 다음과 같은 표현이 가능합니다.
let myMixedArray = {
    types: [FirstType(1), SecondType("hello,world!")]
}
  • 타입 추론에 의해 myMixedArray는 testArray로 분류되었고, 그 타입에 맞게 생성된 firsttype, secondtype들이 배열의 인자로 들어가 있는것이죠!

  • 마지막으로 한가지 주의할 점을 언급하고 이만 시마이할게요!

type account =
  | Facebook(string, int) 

type account2 =
  | Instagram((string, int)) 
  • account는 string, int를 각각의 인자로 갖는 타입인 반면,
  • account2는 (string, int) 라는 tuple을 하나의 인자로 갖는 타입입니다!

그럼 오늘은 여기까지~