20

F# を使用すると、次のような型を簡単に定義できます。

type coords = { X : float; Y : float }

しかし、より詳細なクラス定義構文に入ることなく、コンストラクターの制約/チェック引数を定義するにはどうすればよいですか? たとえば、座標を (0,0) から開始するか、例外をスローする場合。

さらに、定義をクラスに変更する場合は、Equals() などを実装する必要があります。不要な定型コード (および C# で回避しようとしているもの) をすべて実装する必要があります。

4

4 に答える 4

9

Designing with Types on F# for fun and Profitというシリーズがあります。「コンストラクターの使用を強制する」セクションでは、コンストラクター関数の使用を推奨しています。これは、型がインスタンス化される前に検証が行われる場所です。人々が型を直接インスタンス化しないようにするために、命名規則または署名ファイルのいずれかを推奨しています。

「ドメイン駆動設計 f#」をグーグルで検索すると、さらに関連する記事や例がいくつか見つかります。

私は C# 出身であり、F# をドメイン層に適用していないことに注意してください (まだ ;) 推奨される方法のいずれかが、より大きなプロジェクトでどのように機能するかはわかりません。この勇敢な新しい世界では、いくつかのことは確かに異なっているように見えます。

于 2013-08-30T23:35:57.513 に答える
4

クラス定義構文を使用する必要があります。

type coords(x: float, y: float) =
  do
    if x < 0.0 then
      invalidArg "x" "Cannot be negative"
    if y < 0.0 then
      invalidArg "y" "Cannot be negative"

  member this.X =
    x
  member this.Y =
    y
于 2013-08-30T19:35:50.537 に答える