代码之家  ›  专栏  ›  技术社区  ›  Alexander Zeitler

递归联合类型和列表

f#
  •  0
  • Alexander Zeitler  · 技术社区  · 4 年前

    我从F开始,在 https://fsharpforfunandprofit.com/posts/fsharp-in-60-seconds//

    给出链接中的示例

    type Employee =
      | Worker of Person
      | Manager of Employee list
    

    如何创建类型的值 Manager

    我可以创造一个类型的价值 Worker 这样地:

    let john = {First = "John"; Last="Doe"}
    let worker = Worker john
    

    但我不知道如何创造价值 jane 经理 john 分配为 Empoyee 列表:

    let jane =  { First="Jane"; Last="Doe" }
    let manager = Manager [worker]
    

    这行,但我不能分配 First Last manager .

    经理是不是应该没有 弗斯特 在这个例子里?

    我将如何更改Manager的类型定义以同时拥有 Employee ?

    此外,它看起来也像 没有成员 employees 我可以在创建类型的值后访问 经理

    1 回复  |  直到 4 年前
        1
  •  1
  •   Fyodor Soikin    4 年前

    给定该类型定义,管理器不能有名字/姓氏。类型定义不包含类似的内容。

    使 Manager Worker Person 价值观:

    type Employee = Worker of Person | Manager of Person * Employee list
    

    然后您可以创建经理Jane:

    let manager = Manager ({ First = "Jane"; Last = "Doe" }, [worker])
    

    至于一个成员 employees ,有几件事要说。

    首先,远离会员。F#首先起作用。函数比成员好(原因是我不打算在这里讨论)。有一个功能:

    let employees emp = 
        match emp with
        | Manager (_, emps) -> emps
        | Worker _ -> ???  // what to return if the employee turned out to be worker?
    

    经理 ? 那还什么呢?

    工人

    let employees emp = 
        match emp with
        | Manager (_, emps) -> emps
        | Worker _ -> []
    

    另一种可能是返回 Option

    但如果你绝对坚持要有一个会员(请, 拜托

    type Employee = Worker of Person | Manager of Person * Employee list
        with
            member this.employees =
              match this with
              | Manager (_, emps) -> emps
              | Worker _ -> []