Fシャープレコードの新しいプロパティを変更して追加する必要があります。しかし、この新しいフィールドがなくても前のインスタンスにエラーが発生します。私はNullableとして作成しましたが、同じエラーが発生しました。この問題を解決するのを手伝ってください。Fsharpレコードのオプションパラメータ
答えて
「レコードをインスタンス化するときに提供していないフィールド」のように「オプション」を意味します。しかし、残念なことにF#レコードのオプションフィールド(またはあなたの視点に応じて、幸運なことに)のようなものはありません。指定したすべてのレコードフィールドは、インスタンス化する時点ででなければなりません。
this closely related questionも参照してください。
が記録を使用してください:あなたはこのトレードオフを考慮することができる
。レコードを更新するたびに、F#コンパイラはこのレコードを使用したすべての場所について叫んで警告し、追加情報を提供する必要があります。オプションの場合、追加したフィールドの追加情報は
None
になります。大きな利点:field1
が見つからない場合はどうすればよいでしょうか?field2
も見つからない場合はどうなりますか?クラスを使用してください。クラスを更新すると、F#コンパイラは、クラスに入れた情報に関する完全性チェックを実行しません。 (レコードは、すべてのフィールドがコンストラクタ引数であり、すべてが提供されなければならないクラスとしてレコードを見ることができます)。したがって、クラス定義を更新するとオーバーヘッドは発生しませんが、コードですべての欠損値を処理する必要があります。
私は新しいフィールドを追加することの意味合いを通じて考えるようにそれ力ので、私は個人的にレコードを好みます。
はもちろん、ミドルグラウンドがあります:あなたは、レコードを使用しますが、静的メンバまたは同様のものを経由して、それらのすべてのインスタンスを作成することができます
type Name =
{
First: string
Family: string
}
static member Create(first, family) = { First = first; Family = family}
場合は、あなたのコードでは、あなたはいつもレコードをインスタンス化するName.Create
を使用しますもちろん、消費者コードに気づかずにMiddleName
フィールドを追加することもできます。
「初期化されていない変数」が機能的な考え方に存在しないという単純な理由から、Option typeがF#でnullよりも優先されます。
最初に、ボスによって承認されなければならないVacationRequest
を表すレコードを作成しましょう。
type VacationRequest =
{Name : string
Date : DateTime
Approval : string option}
あなたのアプローチの問題点は、すべてのフィールドが建設に割り当てなければならないことであるので、これはコンパイルされません。
let holiday =
{Name = "Funk"
Date = DateTime(2020,12,31)}
あなたは暗黙的に設定し、ヘルパー関数を使用して、この問題を回避することができますオプション値
let fillInRequest name date =
{Name = name
Date = date
Approval = None}
これで、ヘルパー機能を使用してレコードを作成できます。
let holiday = fillInRequest "Funk" <| DateTime(2020,12,31)
FSIにコードを送信するときに面白いことに気付いた。
val holiday : VacationRequest = {Name = "Funk"; Date = 31/12/2020 12:00:00 ; Approval = null;}
上司はその要求(新しいレコードを作成する)
let approvedHoliday =
{holiday with Approval = Some "boss' name"}
val approvedHoliday : VacationRequest = {Name = "Funk"; Date = 31/12/2020 12:00:00 ; Approval = Some "boss' name";}
または
変更せずにそれを送り返すを更新でき0let betterLuckNextTime = holiday
- 1. fsharpのオプションタイプでレコードを初期化する方法
- 2. NSubstituteとFSharp - FSharp関数をモックする
- 3. オプションパラメータ
- 4. Fsharpインタラクティブ府
- 5. イベントとFSharp
- 6. FSharpオプションとヌル
- 7. オプションパラメータは
- 8. メソッドのMVCオプションパラメータ
- 9. Springデータクエリメソッドのオプションパラメータ
- 10. PHPインターフェイスのオプションパラメータ
- 11. ストアドプロシージャのオプションパラメータ
- 12. Yii2、ルーターのオプションパラメータ
- 13. Javascriptコールバックのオプションパラメータ
- 14. FSharpとMicrosoft Office PIA
- 15. FSharpCoreバージョン4.4.0.0 for fsharp 4.0 vs fsharpcore 4.1 with fsharp 4.1
- 16. fsi.exeのプロキシ(fsharp対話式)
- 17. C#の空のオプションパラメータ
- 18. Concrete5:Route :: registerのオプションパラメータ
- 19. カスタム関数のオプションパラメータ
- 20. ABAP CDS VIEWのオプションパラメータ?
- 21. ASP.NET Webサービスのオプションパラメータ
- 22. URLのオプションパラメータ - Slim 3
- 23. オプションパラメータJPA 2.1
- 24. テーブル値オプションパラメータ
- 25. Swift 3オプションパラメータ
- 26. Crystal Reportsオプションパラメータ
- 27. C#4オプションパラメータ
- 28. Visual Studioコード用Ionide-fsharp
- 29. Web APIのオプションパラメータのマップC#
- 30. 多くのオプションパラメータの処理
この質問はあいまいですが、答えは 'with'キーワード –
Qにいくつかのコードを追加できますか? –
前のインスタンスが新しいフィールドを使用するように更新しますか? –