옵션
F#의 옵션 형식은 명명된 값이나 변수에 대한 실제 값이 없을 수 있는 경우에 사용됩니다. 옵션에는 기본 형식이 있으며 해당 형식의 값을 보유할 수 있거나 값이 없을 수 있습니다.
설명
다음 코드는 옵션 형식을 생성하는 함수를 보여 줍니다.
let keepIfPositive (a: int) = if a > 0 then Some(a) else None
보듯이 입력 a
이 0 Some(a)
보다 크면 생성됩니다. 그렇지 않으면 None
생성됩니다.
이 값 None
은 옵션에 실제 값이 없는 경우에 사용됩니다. 그렇지 않으면 식 Some( ... )
에서 옵션에 값을 제공합니다. 값 Some
은 None
다음 함수와 같이 패턴 일치에 유용합니다. 이 함수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인 값을 전달할 null
수 Some
있습니다. 이는 일반적으로 피해야 하며 일반적으로 일상적인 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.isSome 및 Option.isNone 은 옵션에 값이 있는지 여부를 테스트하는 두 모듈 함수입니다. Option.get 은 값이 있는 경우 값을 가져옵니다. 값이 없으면 throw됩니다 System.ArgumentException
.
값이 있는 경우 Option.bind 함수는 값에 대한 함수를 실행합니다. 함수는 정확히 하나의 인수를 사용해야 하며 해당 매개 변수 형식은 옵션 형식이어야 합니다. 함수의 반환 값은 다른 옵션 형식입니다.
옵션 모듈에는 목록, 배열, 시퀀스 및 기타 컬렉션 형식에 사용할 수 있는 함수에 해당하는 함수도 포함되어 있습니다. 이러한 함수에는 ,Option.iter
, Option.forall
, Option.exists
Option.foldBack
, Option.fold
및 Option.count
.가 포함Option.map
됩니다. 이러한 함수를 사용하면 0개 또는 1개의 요소 컬렉션처럼 옵션을 사용할 수 있습니다. 자세한 내용 및 예제는 목록의 컬렉션 함수에 대한 설명을 참조하세요.
다른 형식으로 변환
옵션은 목록 또는 배열로 변환할 수 있습니다. 옵션이 이러한 데이터 구조 중 하나로 변환되면 결과 데이터 구조에는 0개 또는 1개의 요소가 있습니다. 옵션을 배열로 변환하려면 .를 사용합니다 Option.toArray
. 옵션을 목록으로 변환하려면 .를 사용합니다 Option.toList
.
참고 항목
.NET