let 바인딩let Bindings

바인딩은 식별자를 값 또는 함수와 연결 합니다.A binding associates an identifier with a value or function. let 키워드를 사용 하 여 값 또는 함수에 이름을 바인딩합니다.You use the let keyword to bind a name to a value or function.

구문Syntax

// Binding a value:
let identifier-or-pattern [: type] =expressionbody-expression
// Binding a function value:
let identifier parameter-list [: return-type ] =expressionbody-expression

설명Remarks

let 키워드는 하나 이상의 이름에 대 한 값 또는 함수 값을 정의 하는 바인딩 식에 사용 됩니다.The let keyword is used in binding expressions to define values or function values for one or more names. 가장 간단한 형태의 let 식은 다음과 같이 이름을 단순 값에 바인딩합니다.The simplest form of the let expression binds a name to a simple value, as follows.

let i = 1

새 줄을 사용 하 여 식별자에서 식을 구분 하는 경우 다음 코드와 같이 식의 각 줄을 들여씁니다.If you separate the expression from the identifier by using a new line, you must indent each line of the expression, as in the following code.

let someVeryLongIdentifier =
    // Note indentation below.
    3 * 4 + 5 * 6

이름 대신 이름을 포함 하는 패턴 (예: 다음 코드와 같이 튜플)을 지정할 수 있습니다.Instead of just a name, a pattern that contains names can be specified, for example, a tuple, as shown in the following code.

let i, j, k = (1, 2, 3)

본문 식은 이름이 사용 되는 식입니다.The body-expression is the expression in which the names are used. Body 식이 해당 줄에 표시 되 고 let 키워드의 첫 번째 문자를 사용 하 여 정확히 줄 위로 들여쓰기 됩니다.The body expression appears on its own line, indented to line up exactly with the first character in the let keyword:

let result =

    let i, j, k = (1, 2, 3)

    // Body expression:
    i + 2*j + 3*k

let 바인딩은 모듈 수준, 클래스 형식 정의 또는 함수 정의에서와 같은 로컬 범위에서 나타날 수 있습니다.A let binding can appear at the module level, in the definition of a class type, or in local scopes, such as in a function definition. 모듈 let 의 최상위 수준 또는 클래스 형식에서 바인딩에는 본문 식이 필요 하지 않지만 다른 범위 수준에는 body 식이 필요 합니다.A let binding at the top level in a module or in a class type does not need to have a body expression, but at other scope levels, the body expression is required. 다음 코드에 나와 있는 것 처럼 let 바인딩 이름은 정의 지점 후에 사용할 수 있지만 바인딩이 나타나기 전의 시점에는 사용할 수 없습니다.The bound names are usable after the point of definition, but not at any point before the let binding appears, as is illustrated in the following code.

// Error:
printfn "%d" x
let x = 100
// OK:
printfn "%d" x

함수 바인딩Function Bindings

함수 바인딩은 함수 이름 및 매개 변수를 포함 하는 것을 제외 하 고 다음 코드에 표시 된 것과 같이 값 바인딩에 대 한 규칙을 따릅니다.Function bindings follow the rules for value bindings, except that function bindings include the function name and the parameters, as shown in the following code.

let function1 a =
    a + 1

일반적으로 매개 변수는 튜플 패턴과 같은 패턴입니다.In general, parameters are patterns, such as a tuple pattern:

let function2 (a, b) = a + b

let 바인딩 식은 마지막 식의 값으로 계산 됩니다.A let binding expression evaluates to the value of the last expression. 따라서 다음 코드 예제에서의 result 값은로 300계산 되는에서 100 * function3 (1, 2)계산 됩니다.Therefore, in the following code example, the value of result is computed from 100 * function3 (1, 2), which evaluates to 300.

let result =
    let function3 (a, b) = a + b
    100 * function3 (1, 2)

자세한 내용은 함수를 참조하세요.For more information, see Functions.

형식 주석Type Annotations

콜론 (:)을 포함 하 여 매개 변수의 형식을 지정할 수 있습니다. 다음에 형식 이름이 오고 모두 괄호로 묶여 있습니다.You can specify types for parameters by including a colon (:) followed by a type name, all enclosed in parentheses. 마지막 매개 변수 뒤에 콜론과 형식을 추가 하 여 반환 값의 형식을 지정할 수도 있습니다.You can also specify the type of the return value by appending the colon and type after the last parameter. 정수를 매개 변수 형식 function1으로 사용 하는에 대 한 전체 형식 주석은 다음과 같습니다.The full type annotations for function1, with integers as the parameter types, would be as follows.

let function1 (a: int) : int = a + 1

명시적 형식 매개 변수가 없는 경우 형식 유추를 사용 하 여 함수 매개 변수의 형식을 결정 합니다.When there are no explicit type parameters, type inference is used to determine the types of parameters of functions. 여기에는 매개 변수의 형식을 제네릭으로 자동으로 일반화 하는 작업이 포함 될 수 있습니다.This can include automatically generalizing the type of a parameter to be generic.

자세한 내용은 자동 일반화형식 유추를 참조 하세요.For more information, see Automatic Generalization and Type Inference.

클래스의 let 바인딩let Bindings in Classes

let 바인딩은 클래스 형식에 표시 될 수 있지만 구조체 또는 레코드 형식에는 표시 되지 않습니다.A let binding can appear in a class type but not in a structure or record type. 클래스 형식에 let 바인딩을 사용 하려면 클래스에 기본 생성자가 있어야 합니다.To use a let binding in a class type, the class must have a primary constructor. 생성자 매개 변수는 클래스 정의의 형식 이름 뒤에 나와야 합니다.Constructor parameters must appear after the type name in the class definition. 클래스 형식의 do 바인딩은 해당 클래스 형식에 대 한 전용 필드 및 멤버를 정의 하 고, 형식의 바인딩과 함께 형식의 기본 생성자에 대 한 코드를 구성 합니다. letA let binding in a class type defines private fields and members for that class type and, together with do bindings in the type, forms the code for the primary constructor for the type. 다음 코드 예제에서는 전용 필드 MyClass field1field2를 사용 하는 클래스를 보여 줍니다.The following code examples show a class MyClass with private fields field1 and field2.

type MyClass(a) =
    let field1 = a
    let field2 = "text"
    do printfn "%d %s" field1 field2
    member this.F input =
        printfn "Field1 %d Field2 %s Input %A" field1 field2 input

field1field2 의 범위는 선언 된 형식으로 제한 됩니다.The scopes of field1 and field2 are limited to the type in which they are declared. 자세한 내용은 클래스 클래스의 let바인딩을 참조하세요.For more information, see let Bindings in Classes and Classes.

Let 바인딩의 형식 매개 변수Type Parameters in let Bindings

모듈 수준, 형식 또는 계산 식의 바인딩은명시적형식매개변수를가질수있습니다.letA let binding at the module level, in a type, or in a computation expression can have explicit type parameters. 함수 정의 내에서와 같이 식의 let 바인딩에는 형식 매개 변수를 사용할 수 없습니다.A let binding in an expression, such as within a function definition, cannot have type parameters. 자세한 내용은 제네릭을 참조하세요.For more information, see Generics.

Let 바인딩의 특성Attributes on let Bindings

다음 코드와 같이 모듈의 최상위 let 바인딩에 특성을 적용할 수 있습니다.Attributes can be applied to top-level let bindings in a module, as shown in the following code.

[<Obsolete>]
let function1 x y = x + y

Let 바인딩의 범위 및 접근성Scope and Accessibility of Let Bindings

Let 바인딩을 사용 하 여 선언 된 엔터티의 범위는 바인딩이 표시 된 후 포함 하는 범위 (예: 함수, 모듈, 파일 또는 클래스)의 일부분으로 제한 됩니다.The scope of an entity declared with a let binding is limited to the portion of the containing scope (such as a function, module, file or class) after the binding appears. 따라서 let 바인딩에서 범위에 이름을 제공 하는 것으로 간주 될 수 있습니다.Therefore, it can be said that a let binding introduces a name into a scope. 모듈의 let 바인딩 값 또는 함수는 모듈의 public 함수로 컴파일되기 때문에 모듈의 클라이언트가 액세스할 수 있는 한 모듈의 클라이언트에서 액세스할 수 있습니다.In a module, a let-bound value or function is accessible to clients of a module as long as the module is accessible, since the let bindings in a module are compiled into public functions of the module. 이와 대조적으로 클래스의 let 바인딩은 클래스 전용입니다.By contrast, let bindings in a class are private to the class.

일반적으로 모듈의 함수는 클라이언트 코드에서 사용 될 때 모듈의 이름으로 한정 되어야 합니다.Normally, functions in modules must be qualified by the name of the module when used by client code. 예를 들어 모듈 Module1 에 함수가 function1있는 경우 사용자는 함수를 참조 Module1.function1 하도록 지정 합니다.For example, if a module Module1 has a function function1, users would specify Module1.function1 to refer to the function.

모듈의 사용자는 가져오기 선언을 사용 하 여 모듈 이름으로 한정 되지 않고 해당 모듈 내의 함수를 사용할 수 있도록 만들 수 있습니다.Users of a module may use an import declaration to make the functions within that module available for use without being qualified by the module name. 위에서 언급 한 예제에서 모듈의 사용자는이 경우에는 가져오기 선언을 Module1 사용 하 여 모듈을 열고, 그 이후에는를 function1 직접 참조 합니다.In the example just mentioned, users of the module can in that case open the module by using the import declaration open Module1 and thereafter refer to function1 directly.

module Module1 =
    let function1 x = x + 1.0

module Module2 =
    let function2 x =
        Module1.function1 x

open Module1

let function3 x =
    function1 x

일부 모듈에는 RequireQualifiedAccess특성이 있습니다. 즉, 표시 되는 함수는 모듈 이름으로 한정 되어야 합니다.Some modules have the attribute RequireQualifiedAccess, which means that the functions that they expose must be qualified with the name of the module. 예를 들어 F# 목록 모듈에는이 특성이 있습니다.For example, the F# List module has this attribute.

모듈 및 access control에 대 한 자세한 내용은 모듈Access Control을 참조 하세요.For more information on modules and access control, see Modules and Access Control.

참고자료See also