Value Options(값 옵션)
Value Options(값 옵션)
F#의 ValueOption 형식은 두 가지 조건이 동시에 성립할 때 사용해요. 첫째, F#의 Option이 어울리는 상황이면서, 둘째로 그 상황에서 구조체(struct)를 쓰면 성능상 이득이 있을 때죠.
하지만 모든 성능에 민감한 상황이 구조체로 해결되는 건 아니에요. 참조 형식 대신 구조체를 쓰면 그만큼 복사(copy) 비용이 추가로 발생한다는 점을 꼭 고려해야 해요. 다만 규모가 큰 F# 프로그램에서는 핫 경로(hot path)를 오가는 옵션 형식 인스턴스가 아주 많이 만들어지기 마련이라, 그런 경우엔 구조체가 프로그램 전체 수명에 걸쳐 더 나은 종합 성능을 내는 일이 흔해요.
본문
정의(Definition)
ValueOption은 참조형 옵션 형식과 비슷한 구조체 판별 유니온(struct discriminated union) 으로 정의돼요. 그 정의는 대략 이렇게 생겼다고 보면 돼요.
[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
| ValueNone
| ValueSome of 'T
ValueOption은 구조적 동등성(structural equality)과 비교(structural comparison)를 따르는데, 핵심 차이는 **컴파일된 이름, 형식 이름, 그리고 케이스 이름이 모두 값 형식(value type)**임을 드러낸다는 점이에요.
Value Option 사용하기
ValueOption은 Option과 똑같은 방식으로 사용해요. 값이 있음을 나타낼 땐 ValueSome을, 값이 없을 땐 ValueNone을 쓰면 돼요.
let tryParseDateTime (s: string) =
match System.DateTime.TryParse(s) with
| (true, dt) -> ValueSome dt
| (false, _) -> ValueNone
let possibleDateString1 = "1990-12-25"
let possibleDateString2 = "This is not a date"
let result1 = tryParseDateTime possibleDateString1
let result2 = tryParseDateTime possibleDateString2
match (result1, result2) with
| ValueSome d1, ValueSome d2 -> printfn "Both are dates!"
| ValueSome d1, ValueNone -> printfn "Only the first is a date!"
| ValueNone, ValueSome d2 -> printfn "Only the second is a date!"
| ValueNone, ValueNone -> printfn "None of them are dates!"
Option과 마찬가지로, ValueOption을 반환하는 함수의 이름은 관례상 try를 접두어로 붙여요.
Value Option의 속성과 메서드
현재 ValueOption에 있는 속성은 Value 하나예요. 값이 없는 상태에서 이 속성을 호출하면 InvalidOperationException이 발생해요.
Value Option 함수
FSharp.Core의 ValueOption 모듈은 Option 모듈과 동등한 기능을 제공해요. 이름에서 차이가 나는 것이 몇 가지 있는데, 예를 들면 defaultValueArg가 있어요.
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
이 함수는 Option 모듈의 defaultArg처럼 동작하되, ValueOption을 대상으로 동작한다는 점만 달라요.
더 알아보기
- Options — 참조형 옵션