Sabitler
Bu makalede, F# dilinde literal türünün nasıl belirtileceğini gösteren bir tablo sağlanır.
Literal türleri
Aşağıdaki tabloda F# dilindeki literal türleri gösterilmektedir. Onaltılık gösterimde basamakları temsil eden karakterler büyük/küçük harfe duyarlı değildir; türü tanımlayan karakterler ise büyük/küçük harfe duyarlıdır.
Tür | Açıklama | Son ek veya ön ek | Örnekler |
---|---|---|---|
sbyte | imzalı 8 bit tamsayı | y | 86y 0b00000101y |
bayt | işaretsiz 8 bit doğal sayı | uy! | 86uy 0b00000101uy |
int16 | imzalı 16 bit tamsayı | s | 86s |
uint16 | işaretsiz 16 bit doğal sayı | bizi | 86us |
Int int32 |
imzalı 32 bit tamsayı | l veya hiçbiri | 86 86l |
uint uint32 |
işaretsiz 32 bit doğal sayı | u veya ul | 86u 86ul |
nativeint | imzalı bir doğal sayıya yerel işaretçi | n | 123n |
unativeint | işaretsiz doğal sayı olarak yerel işaretçi | un | 0x00002D3Fun |
int64 | imzalı 64 bit tamsayı | L | 86L |
uint64 | işaretsiz 64 bit doğal sayı | UL | 86UL |
tek, float32 | 32 bit kayan nokta numarası | F veya f |
4.14F , 4.14f ya da infinityf ya da -infinityf |
Eğer | 0x00000000lf |
||
yüzmek; çift | 64 bit kayan nokta numarası | hiç kimse |
4.14 veya 2.3E+32 ya da 2.3e+32 ya da infinity ya da -infinity |
LF | 0x0000000000000000LF |
||
bigint | 64 bit gösterimle sınırlı olmayan tamsayı | Ben | 9999999999999999999999999999I |
On -da -lık | sabit nokta veya rasyonel sayı olarak temsil edilen kesirli sayı | M veya m |
0.7833M veya 0.7833m |
Karakter | Unicode karakteri | hiç kimse |
'a' veya '\u0061' |
Dize | Unicode dizesi | hiç kimse | "text\n" veya @"c:\filename" veya """<book title="Paradise Lost">""" veya "string1" + "string2" Ayrıca bkz. Dizeleri. |
bayt | ASCII karakteri | B | 'a'B |
byte[] | ASCII dizesi | B | "text"B |
Dize veya bayt[] | düz metin dizesi | @ ön eki |
@"\\server\share" (Unicode)@"\\server\share"B (ASCII) |
Adlandırılmış sabitler
Sabit olması amaçlanan değerler Literal özniteliğiyle işaretlenebilir.
Bu öznitelik, bir değerin sabit olarak derlenmiş olmasına neden olma etkisine sahiptir. Aşağıdaki örnekte hem x
hem de aşağıdaki y
sabit değerlerdir, ancak x
çalışma zamanında değerlendirilirken, y
bir derleme zamanı sabitidir.
let x = "a" + "b" // evaluated at run-time
[<Literal>]
let y = "a" + "b" // evaluated at compile-time
Not
Sabit değerlerin derleme zamanında belirlenmesi gerektiğinden ve çalışma zamanı değerlendirmesine bağımlı olmadığından, işlevler [<Literal>]
değerleri hesaplamak için kullanılamaz.
İşlevler neden sabitleri hesaplayamıyor?
[<Literal>]
özniteliği, değerlerin derleme zamanında bilinmesini gerektirir. İşlevler, sabit çıkışlar oluşturuyor gibi görünseler bile çalışma zamanında değerlendirilir ve bu da [<Literal>]
için uygun olmamalarını sağlar. Bu kısıtlama, değişmez değerlerin desen eşleştirme, öznitelik bağımsız değişkenleri ve harici işlevlerle etkileşim gibi senaryolarda güvenle kullanılabilmesini sağlar.
Örneğin, bir işlevin sonucunu bir sabit değere atamaya çalışmak başarısız olur.
[<Literal>]
let yFunc() = "a" + "b" // error FS0267: this is not a valid constant expression
Bu ayrım, dış bir işlevçağrılırken de önem taşır. Örneğin, DllImport
derleme sırasında myDLL
değerini bilmesi gereken bir özniteliktir.
[<Literal>]
bildirimi olmadan bu kod derlenemiyor:
[<Literal>]
let myDLL = "foo.dll"
[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
Desen eşleştirme ifadelerinde, küçük harfle başlayan tanımlayıcılar her zaman değişmez değer yerine bağlanacak değişkenler olarak kabul edilir, bu nedenle değişmez değerleri tanımlarken genellikle ilk büyük harfleri kullanmanız gerekir.
[<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
Adlandırılmış sabitleri kullanan kısa bir desen eşleştirme örneği
Adlandırılmış değişmez değerler, when
yan tümceleri veya ek mantık gereksinimini önleyerek desen eşleştirmeyi daha kısa hale getirir. Mesela:
[<Literal>]
let ErrorCode = 404
let handleResponse code =
match code with
| ErrorCode -> "Not Found"
| _ -> "Other Response"
Açıklamalar
Adlandırılmış sabitler şunlar için kullanışlıdır:
-
when
yan tümcesi olmadan desen eşleştirme. - Öznitelik argümanları.
- Statik tür sağlayıcısı bağımsız değişkenleri.
Unicode dizeleri, \u
ve ardından 16 bit onaltılık kod (0000 - FFFF) veya \U
kullanarak belirtebileceğiniz UTF-32 kodlamaları ve ardından herhangi bir Unicode kod noktasını (00000000 - 0010FFFF) temsil eden 32 bit onaltılık kod kullanarak belirtebileceğiniz açık kodlamalar içerebilir.
|||
dışındaki bit düzeyinde işleçlerin kullanılmasına izin verilmez.
Tamsayılar diğer tabanlarda
İmzalı 32 bit tamsayılar sırasıyla bir 0x
, 0o
veya 0b
ön eki kullanılarak onaltılık, sekizli veya ikili olarak da belirtilebilir.
let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)
Sayısal sabitlerde alt çizgi
Basamakları alt çizgi karakteriyle ayırabilirsiniz (_
).
let value = 0xDEAD_BEEF
let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111
let exampleSSN = 123_45_6789
Özel kayan nokta sonsuzluk değerleri
Hem float
hem de single
kayan nokta sayısal türleri pozitif ve negatif sonsuzluğu temsil eden özel değerlere sahiptir.
F# değeri | F# türü | Karşılık gelen .NET değeri |
---|---|---|
infinity veya +infinity |
float |
PositiveInfinity |
-infinity |
float |
NegativeInfinity |
infinityf veya +infinityf |
single |
PositiveInfinity |
-infinityf |
single |
NegativeInfinity |
Bu değerler doğrudan kullanılabilir veya bir kayan nokta sıfıra ya da verilen türle temsil edilemeyecek kadar küçük bir sayıya bölündüklerinde döndürülür. Mesela:
> 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