我正在努力学习F#,我真的很喜欢到目前为止我所看到的.我正在尝试将一些C#代码实现为F#思维方式,作为练习和学习的练习.
如果之前已经回答过,我真的很抱歉,但我找不到解决我所有问题的答案.
我们拥有销售队伍结构,我们有销售主管和普通销售人员.主管可能有也可能没有主管.
所有销售数据均来自CSV格式的其他系统.在阅读记录时,我们不知道SalesPerson是否有报告.
我似乎不明白如何在F#的不可变世界中加载树.我相信有办法.
我们简化的遗留C#代码定义(翻译成Enligsh)
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; }
}
Run Code Online (Sandbox Code Playgroud)
这是代码的过度简化版本.但问题仍然存在:如何加载树?
我提出了以下F#类型
type SalesPerson = {
Id : int
Supervisor : SalesPerson option
Reports : List<SalesPerson> option
PersonalSales : double
GroupSales : double
}
Run Code Online (Sandbox Code Playgroud)
我甚至不确定这是否是定义类型的F#方式.
我的问题是:
List<T>但我不确定这是否是F#方式. …我试图再次选择F#,我有一个案例,我发现很难处理不变性.
在大多数情况下,我发现不变性非常好.但是,我发现处理嵌套集合非常困难.
我想编写一个用户GUI程序.
为简单起见,我们说我们有这个模型:
type Employee =
{
Name : string
}
type Company =
{
Name : string
Employees : Employee list
}
Run Code Online (Sandbox Code Playgroud)
如果我修改现有Employee的
let myNewEmployee = { myEmployee with Name = "John Smith" }
Run Code Online (Sandbox Code Playgroud)
我得到一个新的Employee,这很好.然而,这里出现了一系列问题:
我需要删除旧的myEmployee并添加myNewEmployee到公司的员工列表中.
这引发了列表中的突变,产生了一个新列表.
这迫使我创建一个新的Company记录,以注入新的集合,不得不重建我有的整个公司列表.
换句话说,更改员工的姓名,使我重建整个数据结构.
每当我感到难过时,我发现F#有不同的创造性做事方式.
我假设我不知道如何以功能的方式处理这种情况,请赐教;)
我应该使用其他F#库,比如F#Data吗?
TIA,大卫