다음을 통해 공유


옵션

F#의 옵션 형식은 명명된 값이나 변수에 대한 실제 값이 없을 수 있는 경우에 사용됩니다. 옵션에는 기본 형식이 있으며 해당 형식의 값을 보유할 수 있거나 값이 없을 수 있습니다.

발언

다음 코드는 옵션 형식을 생성하는 함수를 보여 줍니다.

let keepIfPositive (a: int) = if a > 0 then Some(a) else None

보듯이 입력 a 0보다 크면 Some(a) 생성됩니다. 그렇지 않으면 None 생성됩니다.

None 값은 옵션에 실제 값이 없는 경우에 사용됩니다. 그렇지 않으면 식 Some( ... ) 옵션에 값을 제공합니다. SomeNone 값은 다음 함수 exists처럼 패턴 일치에 유용합니다. 이 함수는 옵션에 값이 있으면 true 반환하고 그렇지 않은 경우 false 반환합니다.

let exists (x: int option) =
    match x with
    | Some(x) -> true
    | None -> false

옵션 사용

옵션은 다음 코드와 같이 검색에서 일치하는 결과를 반환하지 않는 경우에 일반적으로 사용됩니다.

let rec tryFindMatch pred list =
    match list with
    | head :: tail -> if pred (head) then Some(head) else tryFindMatch pred tail
    | [] -> None

// result1 is Some 100 and its type is int option.
let result1 = tryFindMatch (fun elem -> elem = 100) [ 200; 100; 50; 25 ]

// result2 is None and its type is int option.
let result2 = tryFindMatch (fun elem -> elem = 26) [ 200; 100; 50; 25 ]

이전 코드에서 목록은 재귀적으로 검색됩니다. tryFindMatch 함수는 부울 값을 반환하는 조건자 함수 pred과, 검색할 목록을 받습니다. 조건자를 충족하는 요소가 발견되면 재귀가 종료되고 함수는 식 Some(head)옵션으로 값을 반환합니다. 빈 목록이 일치하면 재귀가 종료됩니다. 이때 head 값을 찾을 수 없으며 None 반환됩니다.

컬렉션에서 존재하거나 존재하지 않을 수 있는 값을 검색하는 많은 F# 라이브러리 함수는 option 형식을 반환합니다. 규칙에 따라 이러한 함수는 try 접두사(예: Seq.tryFindIndex)로 시작합니다.

값을 생성하려고 할 때 예외가 throw될 수 있는 경우와 같이 값이 없을 수 있는 경우에도 옵션이 유용할 수 있습니다. 다음 코드 예제에서는 이를 보여 줍니다.

open System.IO

let openFile filename =
    try
        let file = File.Open(filename, FileMode.Create)
        Some(file)
    with ex ->
        eprintf "An exception occurred with message %s" ex.Message
        None

이전 예제의 openFile 함수는 파일이 성공적으로 열리면 File 개체를 반환하고 예외가 발생하면 None 때문에 형식이 string -> File option. 상황에 따라 예외를 전파되도록 허용하는 대신 예외를 처리하는 것이 적절한 설계 선택이 아닐 수 있습니다.

또한 옵션의 Some 사례에 null 또는 null인 값을 전달할 수 있습니다. 이는 일반적으로 피해야 하며 일반적으로 일상적인 F# 프로그래밍에 있지만 .NET에서 참조 형식의 특성으로 인해 가능합니다.

옵션 속성 및 메서드

옵션 형식은 다음 속성 및 메서드를 지원합니다.

속성 또는 메서드 유형 묘사
None 'T option None 값이 있는 옵션 값을 만드는 정적 멤버입니다.
존재하지 않음 bool 옵션에 None 값이 있으면 true 반환합니다.
IsSome bool 옵션에 None않은 값이 있으면 true 반환합니다.
Some 'T option 값을 None아닌 옵션을 생성하는 정적 멤버입니다.
'T 기본 값을 반환하거나 값이 None경우 System.NullReferenceException throw합니다.

옵션 모듈

옵션에 대한 작업을 수행하는 유용한 함수가 포함된 모듈 Option있습니다. 일부 함수는 속성의 기능을 반복하지만 함수가 필요한 컨텍스트에서 유용합니다. Option.isSomeOption.isNone 모두 옵션에 값이 있는지 여부를 테스트하는 모듈 함수입니다. Option.get 값(있는 경우)을 가져옵니다. 값이 없으면 System.ArgumentExceptionthrow됩니다.

Option.bind 함수는 값이 있는 경우 값에 대한 함수를 실행합니다. 함수는 정확히 하나의 인수를 사용해야 하며 해당 매개 변수 형식은 옵션 형식이어야 합니다. 함수의 반환 값은 다른 옵션 형식입니다.

옵션 모듈에는 목록, 배열, 시퀀스 및 기타 컬렉션 형식에 사용할 수 있는 함수에 해당하는 함수도 포함되어 있습니다. 이러한 함수에는 Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.foldOption.count포함됩니다. 이러한 함수를 사용하면 0개 또는 1개의 요소 컬렉션처럼 옵션을 사용할 수 있습니다. 자세한 내용 및 예제는 목록컬렉션 함수에 대한 설명을 참조하세요.

다른 형식으로 변환

옵션은 목록 또는 배열로 변환할 수 있습니다. 옵션이 이러한 데이터 구조 중 하나로 변환되면 결과 데이터 구조에는 0개 또는 1개의 요소가 있습니다. 옵션을 배열로 변환하려면 Option.toArray사용합니다. 옵션을 목록으로 변환하려면 Option.toList사용합니다.

기본값을 사용하여 옵션 변환

목록 및 배열로 변환하는 것 외에도 Option.defaultValue 함수를 사용하여 기본값을 제공하여 옵션을 다른 형식으로 변환할 수 있습니다. 이 기능은 값이 None않도록 하려는 경우에 특히 유용합니다. 예를 들어:

let optionString = Some("F#")
let defaultString = optionString |> Option.defaultValue ""
// defaultString is "F#"

let optionInt = None
let defaultInt = optionInt |> Option.defaultValue 0
// defaultInt is 0

Option.defaultValue 함수를 사용하면 패턴 일치 없이 SomeNone 사례를 원활하게 처리할 수 있습니다.

참조