유연한 형식(F#)
유연한 형식 주석은 매개 변수, 변수 또는 값의 형식이 지정된 형식과 호환됨을 나타냅니다. 이 호환성은 클래스나 인터페이스의 개체 지향 계층 구조에서의 위치에 의해 결정됩니다. 유연한 형식은 형식 계층 구조의 더 높은 형식으로 자동 변환이 이루어지지 않지만 인터페이스를 구현하는 모든 형식 또는 계층 구조에 있는 모든 형식에 대해 기능이 작동하도록 만들고 싶은 경우 특히 유용합니다.
#type
설명
위 구문에서 type은 기본 형식 또는 인터페이스입니다.
유연한 형식은 기본 또는 인터페이스 형식과 호환되는 형식만 사용 가능하다는 제약 조건이 있는 제네릭 형식과 같습니다. 즉, 다음 두 줄의 코드는 서로 의미가 같습니다.
#SomeType
'a when 'a :> 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#에는 파생 형식 또는 인터페이스를 구현하는 형식이 기본 형식이나 인터페이스 형식으로 자동 변환되는 컨텍스트가 있습니다. 이와 같은 자동 변환은 직접적 인수에서 발생하지만, 함수 형식을 반환 형식으로 삼는 경우나 형식 인수의 경우와 같이 더 복잡한 형식의 일부로서 종속된 위치에 사용되는 형식인 경우에는 자동 변환이 이루어지지 않습니다. 따라서 유연한 형식 표기법은 이를 적용하려는 형식이 더 복잡한 형식의 일부인 경우에 특히 큰 효과를 발휘합니다.