2013-11-28 9 views
10

TL; DR: F # derleyici determined by Eugene Fotin ve expanded upon by Gene Belitski olarak, int operator olarak bu bağlamda int yorumlar. En iyi çözüm, System.Int32.MaxValue veya aşağıda açıklandığı gibi benzersiz bir tür takma ad kullanmaktır.F # int.MaxValue, "geçerli bir sabit ifade değil", ancak System.Int32.MaxValue nedir?


aşağıdaki kayıt türünü düşünün:

type User = { 
    Username : string 
} 

Ben Username uzun en az üç karakter olmak istiyorum, bu yüzden StringLength özniteliğini kullanın. Hiçbir maksimum uzunluk, bu yüzden int.MaxValue ayarlayın: Bunun yerine System.Int32 kullanırsanız

This is not a valid constant expression or custom attribute value.

Herşey şeftali olduğunu:

type User = { 
    [<StringLength(int.MaxValue, MinimumLength=3)>] 
    Username : string 
} 

Bu bana aşağıdaki hatayı veriyor

type User = { 
    [<StringLength(System.Int32.MaxValue, MinimumLength=3)>] 
    Username : string 
} 

Aynı zamanda ben int:

takma iseler de derler

Veya tam tipini nitelemek:

type User = { 
    [<StringLength(Microsoft.FSharp.Core.int.MaxValue, MinimumLength=3)>] 
    Username : string 
} 

Ben F # kaynak ve int is defined exactly as you would expect kontrol:

type int32 = System.Int32 
// Then, a few lines later… 
type int = int32 

Neler oluyor? F # ilkel türlerinin çoğu bağlamda diğer türlerle birbiriyle değiştirilebilir olduğunu varsaydım, ama zihinsel modelimden bir şey eksik gibi görünüyor.

cevap

11

: tam adı

  • fonksiyonu int:'T->intMicrosoft.FSharp.Core.Operators.int
  • type int = int32 arasında tam adı tam adı Microsoft.FSharp.Core.int
  • type int<'Measure> = intMicrosoft.FSharp.Core.int<_>
Bu işleyişini demo 210

bir yolu aşağıdaki senaryo olacaktır: biz sadece biz başka bir deyişle

val it : (int -> int) = <fun:[email protected]> 

gibi bir şey çıkacak FSI içinde

int;; 

girerseniz, bir fonksiyonu olduğunu olamaz MaxValue özelliği, kendisiyle ilişkilendirilmiş olması: aynı, int32 için de geçerli olacak

> int.MaxValue;; 

int.MaxValue;; 
----^^^^^^^^ 

... error FS0039: The field, constructor or member 'MaxValue' is not defined 

hangi Bir ifade bağlamında kullanıldığında, FSI tarafından (int -> int32) imzasına sahip başka bir işlev olarak çıkar. Bu bağlamda int yılında

type num = int 

geldiğinde

Şimdi bu yüzden, bu yüzden num bir tür kısaltma yanı ise, System.Int32 için bir tür adı kısaltma olabilir, ama şimdi yeri yok belirsizliği isim anlaşılmaktadır Eğer açıkça tip kişiye atfen Microsoft.FSharp.Core.int kullandığınızda num.MaxValue,

> num.MaxValue;; 
val it : int = 2147483647 

Nihayet FSI içinde vererek, bunu olmasını bekliyoruz tam olarak ne anlaşılmaktadır hiçbir yoktur belirsizlik için yer, beklendiği gibi çalışır.

Öznitelik parametresiyle kullanım durumunuza geri dön - bu bağlamda, int, başka bir yorumu açık veya dolaylı olarak ayarlamadıkça, bağımsız değişken değeri, yani işlev olarak sunmak için ifadenin bir parçası olarak tür çıkarımı tarafından ele alınır.

5

bir dönüştürme işlevi int gibi bir özelliğin parametre int tedavi derleyici gibi.

F # tür kesmesi tesadüfen int durumunda herhangi biri olabilir aynı ada sahip farklı sözdizimsel varlıklarla farklı bağlamlarda nasıl işlediği
+0

Haklısınız, işte olan bu. Merak ediyorum neden bu? F # grammarındaki bir şey, sanırım? –

İlgili konular