小编Cra*_*ard的帖子

F#从CSV文件加载树

我正在努力学习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#方式.

我的问题是:

  1. 主管指向另一个SalesPerson,它是不可变的.如果它被新的替换(因为不可变数据有效),引用将会中断.
  2. 报告是不可改变的.我认为我可以使用C#,List<T>但我不确定这是否是F#方式. …

tree f#

5
推荐指数
1
解决办法
153
查看次数

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,大卫

f# nested list

5
推荐指数
0
解决办法
138
查看次数

标签 统计

f# ×2

list ×1

nested ×1

tree ×1