2012-01-11 8 views
3
と併用するタイプ

だから私は、私が求めていたこの質問から学んだ上に追加します。これは私がするかどうかについて考えるようになったハイブリッド機能/オブジェクト指向言語:メソッドまたは方法や種類

F# Records: Dangerous, only for limited use, or well used functionality?

私はメソッドやレコード(?)とメソッドでタイプを使用する必要があります。たとえば、これは私が作るかもしれない典型的なタイプです:

(* User Interaction Start *) 

type UserInteraction public() = 

    member public x.CreatePassword(originalPassword) = 
    if String.IsNullOrEmpty originalPassword then 
     raise(new ArgumentException "CreatePassword: password is null or empty") 
    let hashUtility = new HashUtility(); 

    hashUtility.CreateHash originalPassword 

私はこれを見ることができる問題があることが許可されているため、そのUserInteractionタイプ内の何かが可変である可能性がありますです。レコードタイプでは、わかっている限り、それらは不変であることが保証されています。

レコードタイプのみを取り込むか返すメソッドを持つモジュールを設計する方が良いでしょうか、メソッドチェインを使用してさらに一歩進んでください。

+1

達成したいことは何ですか? – pad

+1

機能的な世界で自分自身をより良くする。私は関数型プログラミングにはかなり新しいので、私はそれを試しているにもかかわらず、F#が許すので命令的な規則を強制するだけであるかどうか把握しようとしています。 –

+1

Scalaの質問はどうですか? ScalaはF#レコードに正確に類似したものを持っておらず、 'val'や' var'を宣言することで、何かが変更可能か不変かを簡単に制御することができます。 (また、あなたがそれを十分に頑張れば、どこかでいつでも可変状態を隠すことができます。) –

答えて

8

When to Use Classes, Unions, Records, and Structures[MSDN](ページの一番下)を読むことができます。あなたはレコードに関するいくつかの間違った仮定を持っているようです。たとえば、クラスのようにフィールドを変更することができます。重要な相違点は、継承、パターンマッチング、コンストラクタ、隠しメンバ、等価、およびコピー&更新式です。

ちょっと気付いたのはそのページの小さなエラーです:レコードは実際にはインターフェイスを実装できます。

もう一つの可能​​性が役に立つセクション:あなたが行うには完全に合理的なものであるタイプの新しい変更したインスタンスを返す不変のタイプにメンバーを作成することができますDifferences Between Records and Classes[MSDN](ページの一番下)

3

注:

type Person = 
    { Name : string; Age : int } 

    member x.GrowOlder n = 
     { x with Age = x.Age + n } 

let q = { Name = "David"; Age = 29 };; 
q.GrowOlder 1 

次のC#コードであることに注意することは興味深いです:

var x = 0; 
var y = 1; 
var z = x + y; 

あなたはどちらのxやyが変異されることを期待しないだろう演算子+を使用すると、+は新しい値を返し、xもyも変更しません。一般的に、そのことを念頭に置いてすべてを設計することを検討できます。

関連する問題