다음을 통해 공유


튜플

튜플은 명명되지 않았지만 순서가 지정된 값의 그룹화이며 형식이 다를 수 있습니다. 튜플은 참조 형식 또는 구조체일 수 있습니다.

구문

(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)

함수 및 fstsnd (참조 튜플만 해당)는 튜플의 첫 번째 요소와 두 번째 요소를 각각 반환합니다.

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 및 stringa로 (10, 10.0, "ten")구성된 튜플의 intfloat경우 형식은 다음과 같이 작성됩니다.

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 튜플동일하며 양방향으로 상호 운용됩니다.

참고 항목