튜플
튜플은 명명되지 않았지만 순서가 지정된 값의 그룹화이며 형식이 다를 수 있습니다. 튜플은 참조 형식 또는 구조체일 수 있습니다.
구문
(element, ... , element)
struct(element, ... ,element )
설명
이전 구문의 각 요소는 유효한 F# 식일 수 있습니다.
예제
튜플의 예로는 동일하거나 다른 형식의 쌍, 트리플 등이 있습니다. 다음 코드에는 몇 가지 예제가 나와 있습니다.
(1, 2)
// Triple of strings.
("one", "two", "three")
// Tuple of generic types.
(a, b)
// Tuple that has mixed types.
("one", 1, 2.0)
// Tuple of integer expressions.
(a + 1, b + 1)
// Struct Tuple of floats
struct (1.025f, 1.5f)
개별 값 가져오기
패턴 일치를 사용하여 다음 코드와 같이 튜플 요소에 액세스하고 이름을 할당할 수 있습니다.
let print tuple1 =
match tuple1 with
| (a, b) -> printfn "Pair %A %A" a b
바인딩을 통해 let
식 외부에서 패턴 일치를 통해 튜플을 match
분해할 수도 있습니다.
let (a, b) = (1, 2)
// Or as a struct
let struct (c, d) = struct (1, 2)
또는 튜플에서 함수에 대한 입력으로 패턴 일치를 패턴화할 수 있습니다.
let getDistance ((x1,y1): float*float) ((x2,y2): float*float) =
// Note the ability to work on individual elements
(x1*x2 - y1*y2)
|> abs
|> sqrt
튜플의 요소가 하나만 필요한 경우 필요하지 않은 값에 대한 새 이름을 만들지 않도록 와일드카드 문자(밑줄)를 사용할 수 있습니다.
let (a, _) = (1, 2)
참조 튜플의 요소를 구조체 튜플로 복사하는 것도 간단합니다.
// Create a reference tuple
let (a, b) = (1, 2)
// Construct a struct tuple from it
let struct (c, d) = struct (a, b)
함수 및 fst
snd
(참조 튜플만 해당)는 튜플의 첫 번째 요소와 두 번째 요소를 각각 반환합니다.
let c = fst (1, 2)
let d = snd (1, 2)
트리플의 세 번째 요소를 반환하는 기본 제공 함수는 없지만 다음과 같이 쉽게 작성할 수 있습니다.
let third (_, _, c) = c
일반적으로 패턴 일치를 사용하여 개별 튜플 요소에 액세스하는 것이 좋습니다.
튜플 사용
튜플은 다음 예제와 같이 함수에서 여러 값을 반환하는 편리한 방법을 제공합니다. 이 예제에서는 정수 나누기를 수행하고 작업의 반올림된 결과를 튜플 쌍의 첫 번째 멤버로 반환하고, re기본der를 쌍의 두 번째 멤버로 반환합니다.
let divRem a b =
let x = a / b
let y = a % b
(x, y)
튜플은 일반적인 함수 구문에 의해 암시된 함수 인수의 암시적 커리를 방지하려는 경우에도 함수 인수로 사용할 수 있습니다.
let sumNoCurry (a, b) = a + b
함수를 정의하기 위한 일반적인 구문을 사용하면 다음 코드와 같이 함수 let sum a b = a + b
의 첫 번째 인수의 부분 적용인 함수를 정의할 수 있습니다.
let sum a b = a + b
let addTen = sum 10
let result = addTen 95
// Result is 105.
매개 변수로 튜플을 사용하면 커리가 비활성화됩니다. 자세한 내용은 함수의 "인수 부분 적용"을 참조하세요.
튜플 형식의 이름
튜플인 형식의 이름을 작성할 때 기호를 *
사용하여 요소를 구분합니다. , a 및 string
a로 (10, 10.0, "ten")
구성된 튜플의 int
float
경우 형식은 다음과 같이 작성됩니다.
int * float * string
구조체 튜플 형식에 대한 형식 별칭을 만들 때는 외부 괄호가 필수입니다.
type TupleAlias = string * float
type StructTupleAlias = (struct (string * float))
C# 튜플과의 상호 운용
C#의 튜플은 구조체이며 F#의 구조체 튜플과 동일합니다. C#과 상호 운용해야 하는 경우 구조체 튜플을 사용해야 합니다.
이것은 쉽게 할 수 있습니다. 예를 들어 C# 클래스에 튜플을 전달한 다음 튜플인 결과를 사용해야 하는 경우를 가정해 보세요.
namespace CSharpTupleInterop
{
public static class Example
{
public static (int, int) AddOneToXAndY((int x, int y) a) =>
(a.x + 1, a.y + 1);
}
}
그런 다음 F# 코드에서 구조체 튜플을 매개 변수로 전달하고 결과를 구조체 튜플로 사용할 수 있습니다.
open TupleInterop
let struct (newX, newY) = Example.AddOneToXAndY(struct (1, 2))
// newX is now 2, and newY is now 3
참조 튜플과 구조체 튜플 간 변환
참조 튜플과 구조체 튜플은 완전히 다른 기본 표현을 가지므로 암시적으로 변환할 수 없습니다. 즉, 다음과 같은 코드는 컴파일되지 않습니다.
// Will not compile!
let (a, b) = struct (1, 2)
// Will not compile!
let struct (c, d) = (1, 2)
// Won't compile!
let f(t: struct(int*int)): int*int = t
한 튜플에서 패턴 일치를 패턴화하고 구성 요소로 다른 튜플을 구성해야 합니다. 예시:
// Pattern match on the result.
let (a, b) = (1, 2)
// Construct a new tuple from the parts you pattern matched on.
let struct (c, d) = struct (a, b)
컴파일된 참조 튜플 형식
이 섹션에서는 컴파일될 때의 튜플 형식에 대해 설명합니다. .NET Framework 3.5 이하를 대상으로 하지 않는 한 여기에 있는 정보는 읽을 필요가 없습니다.
튜플은 모두 명명 System.Tuple
된 여러 제네릭 형식 중 하나의 개체로 컴파일되며, 이 개체는 arity 또는 형식 매개 변수 수에 오버로드됩니다. 튜플 형식은 C# 또는 Visual Basic과 같은 다른 언어에서 보거나 F# 구문을 인식하지 못하는 도구를 사용하는 경우 이 양식에 표시됩니다. 이 형식은 Tuple
.NET Framework 4에서 도입되었습니다. 이전 버전의 .NET Framework를 대상으로 하는 경우 컴파일러는 2.0 버전의 F# Core 라이브러리 버전을 사용합니다 System.Tuple
. 이 라이브러리의 형식은 .NET Framework의 2.0, 3.0 및 3.5 버전을 대상으로 하는 애플리케이션에만 사용됩니다. 형식 전달은 .NET Framework 2.0과 .NET Framework 4 F# 구성 요소 간의 이진 호환성을 보장하는 데 사용됩니다.
컴파일된 구조체 튜플 형식
구조체 튜플(예: struct (x, y)
)은 참조 튜플과 근본적으로 다릅니다. 이러한 매개 변수는 형식으로 ValueTuple 컴파일되고, arity 또는 형식 매개 변수 수에 의해 오버로드됩니다. C# 튜플 및 Visual Basic 튜플과 동일하며 양방향으로 상호 운용됩니다.
참고 항목
.NET