다음을 통해 공유


리터럴

이 문서에서는 F#에서 리터럴의 형식을 지정하는 방법을 보여 주는 테이블을 제공합니다.

리터럴 형식

다음 표에서는 F#의 리터럴 형식을 보여줍니다. 16진수 표기법의 숫자를 나타내는 문자는 대/소문자를 구분하지 않습니다. 형식을 식별하는 문자는 대/소문자를 구분합니다.

유형 묘사 접미사 또는 접두사 예제
에스바이트 (sbyte) 부호 있는 8비트 정수 y 86y

0b00000101y
바이트 부호 없는 8비트 자연수 uy 86uy

0b00000101uy
int16 부호 있는 16비트 정수 s 86s
uint16 부호 없는 16비트 자연수 우리 86us
정수

int32
부호 있는 32비트 정수 l 또는 없음 86

86l
uint (unsigned integer, 부호 없는 정수)

uint32
부호 없는 32비트 자연수 u 또는 ul 86u

86ul
nativeint (네이티브 정수) 부호 있는 정수에 대한 네이티브 포인터 n 123n
unativeint 부호 없는 자연수로 네이티브 포인터 0x00002D3Fun
int64 부호가 있는 64비트 정수 L 86L
uint64 부호 없는 64비트 자연수 UL 86UL
단일, float32 32비트 부동 소수점 숫자 F 또는 f 4.14F, 4.14f, infinityf 또는 -infinityf
lf 0x00000000lf
플로트; 더블 64비트 부동 소수점 숫자 없음 4.14, 2.3E+32, 2.3e+32, infinity 또는 -infinity
LF 0x0000000000000000LF
빅인트 정수는 64비트 표현으로 제한되지 않습니다. 나는 9999999999999999999999999999I
십진법 고정 소수점 또는 합리 숫자로 표현되는 소수 자릿수 M 또는 m 0.7833M 또는 0.7833m
Char(문자) 유니코드 문자 없음 'a' 또는 '\u0061'
문자열 유니코드 문자열 없음 "text\n"

또는

@"c:\filename"

또는

"""<book title="Paradise Lost">"""

또는

"string1" + "string2"

문자열를 참조하세요.
바이트 ASCII 문자 B 'a'B
byte[] ASCII 문자열 B "text"B
문자열 또는 바이트[] 정확히 그대로의 문자열 @ 접두사 @"\\server\share"(유니코드)

@"\\server\share"B(ASCII)

명명된 리터럴

상수로 사용할 값은 리터럴 특성으로 표시할 수 있습니다.

이 특성은 값이 상수로 컴파일되도록 하는 효과가 있습니다. 다음 예제에서는 아래의 xy 모두 변경할 수 없는 값이지만 x 런타임에 평가되는 반면 y 컴파일 시간 상수입니다.

let x = "a" + "b" // evaluated at run-time

[<Literal>]
let y = "a" + "b" // evaluated at compile-time

메모

리터럴은 컴파일 시간에 결정되어야 하며 런타임 평가에 의존할 수 없으므로 함수를 사용하여 [<Literal>] 값을 계산할 수 없습니다.

함수가 리터럴을 계산할 수 없는 이유

[<Literal>] 특성은 컴파일 타임에 값을 알려야 합니다. 함수는 상수 출력을 생성하는 것처럼 보이지만 런타임에 평가되므로 [<Literal>]적합하지 않습니다. 이 제한을 사용하면 패턴 일치, 특성 인수 및 외부 함수와의 interop과 같은 시나리오에서 리터럴을 안전하게 사용할 수 있습니다.

예를 들어 함수의 결과를 리터럴에 할당하려고 하면 실패합니다.

[<Literal>]
let yFunc() = "a" + "b" // error FS0267: this is not a valid constant expression

이 구분은 외부 함수호출할 때도 중요합니다. 예를 들어 DllImport 컴파일하는 동안 myDLL 값을 알아야 하는 특성입니다. [<Literal>] 선언이 없으면 이 코드가 컴파일되지 않습니다.

[<Literal>]
let myDLL = "foo.dll"

[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()

패턴 일치 식에서 소문자로 시작하는 식별자는 항상 리터럴이 아닌 바인딩할 변수로 처리되므로 일반적으로 리터럴을 정의할 때 초기 대문자를 사용해야 합니다.

[<Literal>]
let SomeJson = """{"numbers":[1,2,3,4,5]}"""

[<Literal>]
let Literal1 = "a" + "b"

[<Literal>]
let FileLocation =   __SOURCE_DIRECTORY__ + "/" + __SOURCE_FILE__

[<Literal>]
let Literal2 = 1 ||| 64

[<Literal>]
let Literal3 = System.IO.FileAccess.Read ||| System.IO.FileAccess.Write

명명된 리터럴을 사용하여 간결한 패턴 일치의 예

명명된 리터럴은 when 절 또는 추가 논리가 필요하지 않도록 하여 패턴 일치를 보다 간결하게 만들 수 있습니다. 예를 들어:

[<Literal>]
let ErrorCode = 404

let handleResponse code =
    match code with
    | ErrorCode -> "Not Found"
    | _ -> "Other Response"

발언

명명된 리터럴은 다음과 같은 경우에 유용합니다.

  • when 절이 없는 패턴의 일치
  • 특성 인수입니다.
  • 정적 형식 공급자 인수입니다.

유니코드 문자열에는 \u 뒤에 16비트 16진수 코드(0000 - FFFF)를 사용하여 지정할 수 있는 명시적 인코딩이 포함될 수 있으며, 또는 \U 뒤에 유니코드 코드 포인트(00000000 - 0010FFFF)를 나타내는 32비트 16진수 코드를 사용하여 UTF-32 인코딩을 지정할 수 있습니다.

||| 이외의 비트 연산자는 사용할 수 없습니다.

다른 베이스의 정수

부호 있는 32비트 정수는 각각 0x, 0o 또는 0b 접두사를 사용하여 이진수, 10진수 또는 16진수로 지정할 수도 있습니다.

let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)

숫자 리터럴에 사용되는 밑줄

숫자를 밑줄 문자(_)로 구분할 수 있습니다.

let value = 0xDEAD_BEEF

let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111

let exampleSSN = 123_45_6789

특수 부동 소수점 무한대 값

floatsingle 부동 소수점 숫자 형식에는 양수 및 음수 무한대를 나타내는 특수 값이 연결되어 있습니다.

F# 값 F# 형식 해당 .NET 값
infinity 또는 +infinity float PositiveInfinity
-infinity float NegativeInfinity
infinityf 또는 +infinityf single PositiveInfinity
-infinityf single NegativeInfinity

이러한 값은 직접 사용하거나 부동 소수점 0 또는 지정된 형식으로 표현하기에는 너무 작은 숫자로 나눌 때 반환됩니다. 예를 들어:

> 1.0/0.0;;
val it: float = infinity

> 1.0/(-0.0);;
val it: float = -infinity

> 1.0/0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
;;
val it: float = infinity