리터럴
이 문서에서는 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) |
명명된 리터럴
상수로 사용할 값은 리터럴 특성으로 표시할 수 있습니다.
이 특성은 값이 상수로 컴파일되도록 하는 효과가 있습니다. 다음 예제에서는 아래의 x
및 y
모두 변경할 수 없는 값이지만 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
특수 부동 소수점 무한대 값
float
및 single
부동 소수점 숫자 형식에는 양수 및 음수 무한대를 나타내는 특수 값이 연결되어 있습니다.
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
.NET