옵션(F#)
F#의 옵션 형식은 명명된 값이나 변수에 대한 실제 값이 존재하지 않을 수 있을 때 사용됩니다.옵션에는 내부 형식이 있습니다. 옵션은 내부 형식의 값을 갖거나 값을 전혀 갖지 않을 수 있습니다.
설명
다음 코드에서는 옵션 형식을 사용하는 방법을 보여 줍니다.
let keepIfPositive (a : int) = if a > 0 then Some(a) else None
값 None은 옵션에 실제 값이 없을 때 사용됩니다.그렇지 않으면 Some( ... ) 식을 통해 옵션에 값이 주어집니다.값 Some 및 None은 패턴 일치에 유용하게 사용됩니다. 아래 나와 있는 함수 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 형식을 반환합니다.일반적으로 이러한 함수는 Seq.tryFindIndex의 예에서와 같이 try 접두사로 시작합니다.
옵션은 값이 존재하지 않을 수 있을 때도 유용하게 사용됩니다. 예를 들어 값을 생성하려고 했을 때 예외가 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 함수에는 string -> File option 형식이 있습니다. 이 함수는 파일이 성공적으로 열리면 File 개체를 반환하고, 예외가 발생하면 None을 반환합니다.상황에 따라서는 예외가 전파되도록 허용하는 대신 예외를 catch하도록 선택한 디자인이 적절하지 않을 수도 있습니다.
옵션 속성과 메서드
옵션 형식은 다음 속성 및 메서드를 지원합니다.
속성 또는 메서드 |
형식 |
설명 |
---|---|---|
'T option |
None 값이 있는 옵션 값을 만드는 데 사용할 수 있는 정적 속성입니다. |
|
bool |
옵션에 None 값이 있으면 true를 반환합니다. |
|
bool |
옵션에 None이 아닌 값이 있으면 true를 반환합니다. |
|
'T option |
None이 아닌 값이 있는 옵션을 만드는 정적 멤버입니다. |
|
'T |
내부 값을 반환하거나 값이 None이면 NullReferenceException을 throw합니다. |
Option 모듈
옵션에 대한 작업을 수행하는 유용한 함수가 포함된 Option 모듈도 있습니다.일부 함수는 그 기능이 속성의 기능과 중복되지만 함수가 필요한 컨텍스트에서 유용하게 사용할 수 있습니다.Option.isSome과 Option.isNone은 둘 다 옵션에 값이 있는지 여부를 테스트하는 모듈 함수입니다.Option.get은 값이 있는 경우 해당 값을 가져옵니다.값이 없으면 ArgumentException이 throw됩니다.
Option.bind 함수는 값이 있는 경우 해당 값에 대해 함수를 실행합니다.이렇게 실행되는 함수는 인수를 한 개만 가져야 하며 해당 매개 변수 형식은 옵션 형식이어야 합니다.함수의 반환 값은 또 다른 옵션 형식입니다.
옵션 모듈에는 목록, 배열, 시퀀스 및 기타 컬렉션 형식에 사용할 수 있는 함수에 상응하는 버전의 함수도 포함되어 있습니다.여기에 해당하는 함수로는 Option.map, Option.iter, Option.forall, Option.exists, Option.foldBack, Option.fold 및 Option.count가 있습니다.이러한 함수를 통해 요소가 없거나 한 개만 포함된 컬렉션처럼 옵션을 사용할 수 있습니다.자세한 내용과 예제는 목록에 나오는 컬렉션 함수 설명 부분을 참조하십시오.
다른 형식으로 변환
옵션을 목록이나 배열로 변환할 수 있습니다.옵션을 이러한 데이터 구조 중 하나로 변환하여 만든 데이터 구조에는 요소가 없거나 한 개만 포함됩니다.옵션을 배열로 변환하려면 Option.toArray를 사용합니다.옵션을 목록으로 변환하려면 Option.toList를 사용합니다.