2016-06-24 5 views
3

F#でメジャータイプを作成するにはどのようにすればよいでしょうか?静的メンバーNewに値を与え、与えられたメジャータイプをboolに生成することができますか?boolを生成するにはどのようにメンバ型を静的メンバで作成するか?

これは、int、int64、およびdecimalに対応していますが、これは完全に機能します。

[<Measure>] type MyInt = static member New value = value * 1<MyInt> 
    [<Measure>] type MyInt64 = static member New value = value * 1L<MyInt64> 
    [<Measure>] type MyDecimal = static member New value = value * 1m<MyDecimal> 

しかし、これは動作しません:

[<Measure>] type MyBool = static member New value = value * true<MyBool> 

コンパイルエラーが、私はまた、文字列、および日時と、この全体を実行しているUnexpected token '>' or incomplete expression

です。私の目標は基本的にMeasure型を使用して、単一のケースのユニオン型ラッパーの実行時パフォーマンス・ヒットなしにコンパイル時間のチェックを提供することです。 (See this answer by Jack P. for reference.

理想的には、私はすべてのタイプにこの概念を使用したいと思いますが、数字ではないタイプの仕組みは見ていません。

+0

'LanguagePrimitives.GenericOne'はすべての' new'関数と同じですか? - 少なくとも数字は、ブールをテストしていない –

+0

私はそれを使用するとは思わなかった。私は確認する必要があります。 –

+0

'1 'を 'GenericOne'に置き換えようとしましたが、' int 'を返さないだけで' int'を返します。私は '1 'を 'GenericOne 'に置き換えようとしましたが、コンパイラエラー '予想される型、単位ではありません。' –

答えて

4

だから、唯一のタイプに建てられた、あるこれらはあなたがあなた自身を定義することができ、他のタイプのために

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> 

あるスペックから対策型定義に

を構築しています。

数値型の場合、new関数をLanguagePrimitives.Int32WithMeasureなどと書くことができます。これは、実際には浮動小数点数が少し速いです。私は最近、コンパイル時に1での乗算がすべて行われるように、他の数値型が最適化されていると思います。

+1

ありがとうございました。大変感謝しています。私はこのルートに行き、私が必要とするタイプのメジャータイプを仕様には定義しません。コンパイル時にドメインタイプの「タグ付け」が言語自体とより良く統合されているといいでしょう。 –

関連する問題