4

[< Measure>] 型が一部の代数型のみを拡張する理由を知っている人はいますか? 非常に多くの有用な型を Measure で拡張できないことは、私には奇妙に思えます。

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
4

2 に答える 2

5

さて、ここには 2 つの異なる問題があります。

  1. 設計上、署名されていない型に注釈を付けることができないようです。これがなぜなのかはわかりませんが、次のようなことを試してみると、この効果に関するかなり有益なエラー メッセージが表示されますlet _ = 1u<1>
  2. 型シノニムの仕組みにより、メジャーは「実際の」型でのみ使用でき、そのシノニムでは使用できません。float32これが、とではメジャーを使用できるが、 と では使用できない理由floatです。にも同じことが当てはまることに注意してください。singledoubleint32
于 2013-01-02T22:23:49.047 に答える
4

仕様によると、次のリテラル型のみがメジャーを持つことができます

  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 >

これが、unsigned 型にメジャー型がない理由です。また、物理的な観点からは、単位を含むほとんどすべての量が負になる可能性があるため、これは合理的な代替手段のように思えます。

残りが機能しない理由は、仕様によるものです。

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>これが、関連するタイプがないためできない理由です。

于 2013-01-02T22:37:58.910 に答える