2013-01-02 27 views
4

有誰知道爲什麼[度量>]類型僅增加一些代數類型? 這麼多有用的類型不能用度量增加看起來很奇怪。單個和雙重不能用一個度量增加

type FooType = 
| FooByte  of byte<1>   // Error 
| FooSbyte  of sbyte<1>   // Ok 
| FooInt16  of int16<1>   // Ok 
| FooUint16  of uint16<1>  // Error 
| FooInt  of int<1>   // Ok 
| FooInt32  of uint32<1>  // Error 
| FooInt64  of int64<1>   // Ok 
| FooUint64  of uint64<1>  // Error 
| FooNativeint of nativeint<1>  // Error 
| FooUnativeint of unativeint<1> // Error 
| FooChar  of char<1>   // Error 
| FooDecimal of decimal<1>  // Ok 
| FooFloat32 of float32<1>  // Ok 
| FooSingle  of single<1>  // Error 
| FooFLoat  of float<1>   // Ok 
| FooDouble  of double<1>  // Error 

回答

5

好了,這裏有兩個不同的問題:

  1. 看來,無符號類型無法通過設計來註解。我不確定這是爲什麼,但如果您嘗試類似let _ = 1u<1>之類的東西,則可以獲得有關此效果的非常豐富的錯誤消息。
  2. 由於類型同義詞的工作原理,您只能使用「真實」類型的度量值,而不能使用它們的同義詞。這就是爲什麼您可以使用float32float而不是singledouble的措施。請注意,int32也是如此。
+3

如果對任何人都不清楚,'float32'和'single'與'float'和'double'是一樣的,所以缺少單一和雙重支持更多的是關於語義的功能。 –

3

根據該規範,只有以下文字類型可以有措施

sbyte < measure-literal > //signed byte 
    int16 < measure-literal > 
    int32 < measure-literal > 
    int64 < measure-literal > 
    ieee32 < measure-literal > //float32 
    ieee64 < measure-literal > //float 
    decimal < measure-literal > 

所以這就是爲什麼無符號的類型沒有措施的類型。此外,從物理角度來看,幾乎任何數量的單位都可能是負數,所以這看起來是一個合理的選擇。

之所以休息不工作是從規格:

The F# core library defines the following types: 

type float<[<Measure>] 'U> 
type float32<[<Measure>] 'U> 
type decimal<[<Measure>] 'U> 
type int<[<Measure>] 'U> 
type sbyte<[<Measure>] 'U> 
type int16<[<Measure>] 'U> 
type int64<[<Measure>] 'U> 

這就是爲什麼你不能這樣做single<1>,因爲沒有相關的類型。