옵션

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

설명

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

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

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

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

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

USING 옵션

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

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 이전 예제의 함수는 파일이 성공적으로 열리고 None 예외가 File 발생하는 경우 개체를 반환하기 때문에 형식 string -> File option 이 있습니다. 상황에 따라 예외를 전파하도록 허용하는 대신 예외를 catch하는 것이 적절한 디자인 선택이 아닐 수 있습니다.

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

옵션 속성 및 메서드

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

속성 또는 메서드 Type 설명
None 'T option 값이 있는 옵션 값을 None 만드는 정적 멤버입니다.
IsNone bool 옵션에 값이 있는지를 반환 true 합니다 None .
IsSome bool 옵션에 값이 없는 None경우를 반환 true 합니다.
Some 'T option 값이 아닌 None옵션을 만드는 정적 멤버입니다.
'T 기본 값을 반환하거나 값None이 이면 throw System.NullReferenceException 합니다.

옵션 모듈

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

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

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

다른 형식으로 변환

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

참고 항목