私はF#を学びたいと思っています。私はこれまで見たことが本当に好きです。 私はいくつかのC#コードを練習し、学ぶための練習としてF#の考え方を実装しようとしています。F#CSVファイルからツリーをロード
私は本当に謝罪していますが、私のすべての問題を解決する答えは見つけられませんでした。
私たちには、販売管理者と一般の販売担当者がいる販売組織があります。スーパーバイザーは、スーパーバイザーを持っていてもいなくてもよい。
すべての販売データは、別のシステムからのもので、CSV形式です。 レコードを読み取っている時点で、SalesPersonにレポートがあるかどうかわかりません。
私はF#の不変の世界で木を読み込む方法を理解していないようです。私は道があると確信しています。
(Enligsh翻訳)我々の単純化されたレガシーC#コードが定義
public class SalesPerson
{
public int Id { get; set; }
public SalesPerson Supervisor { get; set; }
public List<SalesPerson> Reports { get; private set; } = new List<SalesPerson>();
public PersonalSales double { get; set; }
public GroupSales double { get; set; }
}
これは、コードの単純化しすぎたバージョンです。しかし、問題は同じままです:ツリーをロードするには?
私はこの場合、私はタイプを定義するのF#の道さえわからない
type SalesPerson = {
Id : int
Supervisor : SalesPerson option
Reports : List<SalesPerson> option
PersonalSales : double
GroupSales : double
}
次F#型を思い付きました。
私の問題は、次のとおりです。
- スーパーバイザが別の販売員を指し、それは不変です。新しいものに置き換えられた場合(不変のデータが機能するため)、参照は中断されます。
- レポートは不変です。私はC#の
List<T>
を使用することができると思いますが、それがF#の方法であるかどうかはわかりません。 - スーパーバイザのレポートのレコードは、スーパーバイザレコードの後にはありません。彼らは、X個の行が下に来るかもしれません。ただし、スーパーバイザレコードがそのスーパーバイザのレポートレコードの前に必ず来るようにします。
- ツリーのロード後にGroupSales計算フィールドを更新する方法。
サンプルCSVファイルは次のようになります。
だから、1,,100.00
2,,110.00
3,1,50.00
4,1,75.00
5,2,80.00
6,,92.00
:
1 -> 2 reports
2 -> 1 report
3,4,5,6 -> No reports
私は本当にあなたがこれらの問題に輝く可能性のある "光" をいただければ幸いです。あなたが別の型にツリー構造を分離した場合
おかげで...
素晴らしい....私はあなたがどのように構造を構築したかを見始めています。しかし、私はどのように行うべきか分からないポイント#4を持っています。あなたは 'GroupSales'をどのようにしますか? (自分の「PersonalSales」+子供の「PersonalSales」)。私はそれを一度だけ計算したいと思います、私たちがそれを求める毎回ではありません。 TIA、David –
@CrazySpaniard可能なのは、与えられたノードを構築するときに使用できる子孫ノードのデータがあるからです。しかし、それは、 'GroupSales'を計算できるようになるまで、レコードタイプの作成を遅らせることを意味します。これは、先ほどと同じように、より早い段階でタイプセーフティを行うことを意味するか、または未使用のタプルを長く置いておくか、生データの中間タイプを作成することを意味します。 – TheQuickBrownFox
@CrazySpaniardそして、あなたが 'GroupSales' =' PersonalSales' +子供の 'GroupSales'を意味していたとします。これは' PersonalSales' + *子孫 '* 'PersonalSales'に相当します。 – TheQuickBrownFox