[Haskell] data: union νŒ¨ν„΄

[원본 링크]

κ΄€λ ¨ 포슀트
https://blog.naver.com/sssang97/221768461037

data νƒ€μž… 선언은 ꡬ쑰체 같은 μƒˆ νƒ€μž…μ„ μ„ μ–Έν•˜λŠ” μš©λ„λ‘œ μ“Έ μˆ˜λ„ μžˆμ§€λ§Œ, union νƒ€μž…μ„ μ„ μ–Έν•˜λŠ”λ° μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€. Rustλ₯Ό κ²½ν—˜ν•΄λ³Έ 적이 μžˆλ‹€λ©΄, enum의 κΈ°λŠ₯을 κ·ΈλŒ€λ‘œ κ°€μ Έκ°„λ‹€κ³  μ΄ν•΄ν•˜λ©΄ λœλ‹€.




enum μ„ μ–Έ

νƒ€μž…μ— |λ₯Ό μ³μ„œ λ‚˜μ—΄ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ 기본적인 ν˜•νƒœμ˜ enum은 μ •μ˜ν•  수 μžˆλ‹€.
μ•„λž˜ μ˜ˆμ œλŠ” 색상을 ν‘œν˜„ν•˜λŠ” Color enum을 μ •μ˜ν•œ μ˜ˆλ‹€.

그럼 κ·Έλƒ₯ μ΄λ ‡κ²Œ μƒμˆ˜μ— enum 값을 ν• λ‹Ήν•΄μ„œ 써먹을 수 μžˆλ‹€.

νŒ¨ν„΄λ§€μΉ­μ—λ„ ν•„λ“œμ— λ”°λ₯Έ λΆ„κΈ°λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

근데 μ €λ ‡κ²Œλ§Œ ν•˜λ©΄ λ­”κ°€ κ°’ 디버깅이 잘 μ•ˆλ˜λ‹ˆκΉŒ, deriving을 ν†΅ν•΄μ„œ λ¬Έμžμ—΄ λ³€ν™˜ κΈ°λŠ₯을 μ œκ³΅ν•΄λ³΄μž.

μ €λŸ¬λ©΄ 이 enum에 λŒ€ν•΄μ„œλ„ Show νƒ€μž…ν΄λž˜μŠ€κ°€ κ΅¬μ²΄ν™”λœλ‹€.


잘 좜λ ₯λœλ‹€.




μ •μˆ˜ν˜• Enum

μ•„μ§κΉŒμ§€λŠ” Enum에 μ΄λ¦„λ§Œ 있고 μ–΄λ– ν•œ 값이 λΆ€μ—¬λ˜μ§€ μ•Šμ•˜λ‹€. RedλŠ” κ·Έλƒ₯ Red일 뿐이닀.
ν•˜μ§€λ§Œ Enum의 λ§Žμ€ usecaseμ—μ„œλŠ” 이걸 μ‹€μ§ˆμ μΈ μ •μˆ˜κ°’ λ“±μœΌλ‘œ λ³€ν™˜ν•΄μ•Ό ν•  κ²½μš°κ°€ λ§Žλ‹€.

그런걸 μ›ν•œλ‹€λ©΄ 직접 Enum을 κ΅¬ν˜„ν•΄λ„ λ˜λŠ”λ°, deriving Enum을 μ“°λ©΄ μˆœμ„œλŒ€λ‘œ μ •μˆ˜κ°’μ„ μžλ™λΆ€μ—¬ν•΄μ€€λ‹€.

μ΄λ ‡κ²Œ. fromEnum으둜 enum->μ •μˆ˜ν˜• λ³€ν™˜μ„, toEnum으둜 μ •μˆ˜ν˜•->enum λ³€ν™˜μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€.




νƒ€μ΄ν•‘λœ enum ν•„λ“œ

μœ„μ—μ„œλŠ” enum ν•„λ“œλ“€μ„ νƒ€μž… 없이 κ·Έλƒ₯ 이름 λ‚˜μ—΄λ§Œ ν–ˆμ§€λ§Œ, νƒ€μž…μ„ 직접 λΆ€μ—¬ν•΄μ„œ λ‹€ν˜•μ μΈ ν˜•νƒœμ˜ 데이터 ꡬ쑰λ₯Ό μ„ μ–Έν•  μˆ˜λ„ μžˆλ‹€.
μ•„λž˜λŠ” Int κ°’μ΄κ±°λ‚˜ String 값을 κ°€μ§ˆ 수 μžˆλŠ” enum을 μ •μ˜ν•˜λŠ” μ˜ˆμ‹œλ‹€.

값을 직접 μ „λ‹¬ν•˜λ©΄μ„œ 생성할 수 있고, νŒ¨ν„΄λ§€μΉ­μ„ 톡해 μ‹€μ œ λ‚΄λΆ€ 값을 κΊΌλ‚΄μ™€μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.




μ œλ„ˆλ¦­

data νƒ€μž… 선언에도 νƒ€μž… 인자λ₯Ό 톡해 μ œλ„ˆλ¦­ κΈ°λŠ₯을 λΆ€μ—¬ν•  수 μžˆλ‹€.
λŒ€ν‘œμ μœΌλ‘œ, monad νƒ€μž…μΈ Maybe 같은 것이 μ œλ„ˆλ¦­ data둜 κ΅¬ν˜„λœ 것이닀.

이 경우 MaybeλŠ” 아무것도 μ—†λŠ” Nothing μƒνƒœμ΄κ±°λ‚˜, μ‹€μ œλ‘œ 값이 μžˆλŠ” Just μƒνƒœμ—¬μ•Ό ν•œλ‹€.
그리고 Just일 κ²½μš°μ—λŠ” κ΅¬μ²΄ν™”λœ νƒ€μž… νŒŒλΌλ―Έν„° a의 값을 λ‚΄λΆ€μ μœΌλ‘œ λ“€κ³  μžˆλŠ”λ‹€. 그게 λ‹€λ‹€.



μ°Έμ‘°
https://wiki.haskell.org/Type#Data_declarations