유연한 형식

유연한 형식 주석은 매개 변수, 변수 또는 값에 지정된 형식과 호환되는 형식이 있음을 나타내며, 호환성은 클래스 또는 인터페이스의 개체 지향 계층 구조에서 위치에 따라 결정됩니다. 유연한 형식은 형식 계층 구조에서 상위 형식으로 자동 변환이 수행되지 않지만 기능이 계층 구조의 모든 형식 또는 인터페이스를 구현하는 모든 형식에서 작동하도록 설정하려는 경우에 특히 유용합니다.

구문

#type

설명

이전 구문 에서 형식 은 기본 형식 또는 인터페이스를 나타냅니다.

유연한 형식은 허용되는 형식을 기본 또는 인터페이스 형식과 호환되는 형식으로 제한하는 제약 조건이 있는 제네릭 형식과 동일합니다. 즉, 다음 두 줄의 코드는 동일합니다.

#SomeType

'T when 'T :> SomeType

유연한 형식은 여러 유형의 상황에서 유용합니다. 예를 들어 더 높은 순서 함수(함수를 인수로 사용하는 함수)가 있는 경우 함수가 유연한 형식을 반환하도록 하는 것이 유용한 경우가 많습니다. 다음 예제에서는 시퀀스 인수 iterate2 와 함께 유연한 형식을 사용하면 상위 순서 함수가 시퀀스, 배열, 목록 및 기타 열거 가능한 형식을 생성하는 함수와 함께 작동할 수 있습니다.

다음 두 함수 중 하나는 시퀀스를 반환하고 다른 함수는 유연한 형식을 반환합니다.

let iterate1 (f : unit -> seq<int>) =
    for e in f() do printfn "%d" e
let iterate2 (f : unit -> #seq<int>) =
    for e in f() do printfn "%d" e

// Passing a function that takes a list requires a cast.
iterate1 (fun () -> [1] :> seq<int>)

// Passing a function that takes a list to the version that specifies a
// flexible type as the return value is OK as is.
iterate2 (fun () -> [1])

또 다른 예로 Seq.concat 라이브러리 함수를 고려합니다.

val concat: sequences:seq<#seq<'T>> -> seq<'T>

다음 열거 가능한 시퀀스를 이 함수에 전달할 수 있습니다.

  • 목록 목록
  • 배열 목록
  • 목록 배열
  • 시퀀스 배열
  • 열거 가능한 시퀀스의 다른 조합

다음 코드에서는 Seq.concat 유연한 형식을 사용하여 지원할 수 있는 시나리오를 보여 줍니다.

let list1 = [1;2;3]
let list2 = [4;5;6]
let list3 = [7;8;9]

let concat1 = Seq.concat [ list1; list2; list3]
printfn "%A" concat1

let array1 = [|1;2;3|]
let array2 = [|4;5;6|]
let array3 = [|7;8;9|]

let concat2 = Seq.concat [ array1; array2; array3 ]
printfn "%A" concat2

let concat3 = Seq.concat [| list1; list2; list3 |]
printfn "%A" concat3

let concat4 = Seq.concat [| array1; array2; array3 |]
printfn "%A" concat4

let seq1 = { 1 .. 3 }
let seq2 = { 4 .. 6 }
let seq3 = { 7 .. 9 }

let concat5 = Seq.concat [| seq1; seq2; seq3 |]

printfn "%A" concat5

출력은 다음과 같습니다.

seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]

F#에서는 다른 개체 지향 언어와 마찬가지로 인터페이스를 구현하는 파생 형식 또는 형식이 자동으로 기본 형식 또는 인터페이스 형식으로 변환되는 컨텍스트가 있습니다. 이러한 자동 변환은 직접 인수에서 발생하지만 형식이 하위 위치에 있거나 함수 형식의 반환 형식과 같은 더 복잡한 형식의 일부 또는 형식 인수인 경우에는 발생하지 않습니다. 따라서 유연한 형식 표기법은 적용하는 형식이 더 복잡한 형식의 일부일 때 주로 유용합니다.

참고 항목