2013-04-06 10 views
5

"Type extensions"と呼ばれるF#機能に関するもう1つの質問です。F#で列挙型を拡張する

F#で列挙を拡張することは不可能です。私は列挙型を拡張するためのC# Extensions Methods多くを使用します。

極限

1:範囲の検証ロジックを追加し、文字列表現を返すメソッドなど

残念ながら、それだけで労働組合を判別しますが、単純な列挙を拡張するが不可能に拡張可能と思われます延長

// CustomEnum.fs 
module CustomEnumModule 

type CustomEnum = 
    | Value1 = 1 
    | Value2 = 2 

// Trying to split definition of the enum 
type CustomEnum with 
    | Value3 = 3 

エラー:「エラーFS0010:予期しない記号 '|'メンバーの定義における」

2.オプションの拡張

// CustomEnumEx.fs 
open CustomEnumModule 

type CustomEnum with 
    member public x.PrintValue() = 
     printfn "%A" x 

エラー: "エラーFS0896:(1)私達ができるので、列挙型は、メンバー"

を持つことはできませんそれは私のために奇妙なようですフル機能の差別化されたユニオンの特別なケースとして単純な列挙を扱います。を区別したユニオンを拡張し、(2).NETの列挙型を拡張するのは、 ding FP機能)を既存のインフラストラクチャに統合します。

この動作は意図的なものですか、これは実装上の単純なバグですか?

P.S.残念ながら、F# Specはこの点に関しては静かであり、少なくとも私はそこでの1つまたは別の動作の証明を見つけることができません。

+0

:[拡張方法Enumは許可されていませんか?](http://cs.hubfs.net/topic/None/59784)これは可能でないことを示唆しており、設計上のものです –

+0

リンクありがとうございます。そして私はこれが**設計上の可能性があることに同意します**。私はこの決定の根底にある根拠を理解できません。 –

答えて

7

タイプ延びると類似しているタイプと同じ名前のモジュールを作成することが可能である:

Hubfs(別名FPish)しばらく前に同様の問題があった
type CustomEnum = Value1 = 1 | Value2 = 2 

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>] 
module CustomEnum = 
    let Print = function 
    | CustomEnum.Value1 -> "One" 
    | CustomEnum.Value2 -> "Two" 
    | _ -> invalidArg "" "" 

let value = CustomEnum.Value1 

let s = CustomEnum.Print value 
+0

ありがとう、これは良い解決策です。私はまだ、F#devチームがenumのためにこの機能を実装しないことを決めたのかと疑問に思います。 –

+0

Fsチームにfsbugs-at-microsoft.comと[User Voice](http://visualstudio.uservoice.com/forums/121579-visual-studio/category/30935-http:私が報告した問題の多くに対応し、解決しました。 –

+0

Thansks、私は間違いなくこれをやろう! –