F# 嵌套记录

kak*_*akk 5 f# functional-programming

  1. 嵌套记录

记录是否类似于字典,它是带有名称的对象树?或者记录只是简单类型的列表

let r = { b = { a = 2 } } // is this possible? if not, how to achieve? is this useful in f#?
Run Code Online (Sandbox Code Playgroud)

对于我来说,受歧视的工会可以实现类似的行为(代码如下)


// Discriminated union for a card's suit 

type Suit = | Heart | Diamond | Spade | Club 
let suits = [Heart; Diamond; Spade; Club]
suits

// Discriminated union for playing cards

type PlayingCard = 
    | Ace of Suit 
    | King of Suit 
    | Queen of Suit
    | Jack of Suit 
    | ValueCard of int * Suit

// generating a deck of cards

let deckOfCards = 
    [
        for suit in [Spade; Club; Heart; Diamond] do   
            yield Ace(suit)
            yield King(suit)
            yield Queen(suit)
            yield Jack(suit)
            for value in 2..10 do
                yield ValueCard(value, suit)
    ]

Run Code Online (Sandbox Code Playgroud)

它有点类似于 python 或 idk 中的字典。下面的代码是虚拟的


type Customer = 
    {
        FirstName : string
        Contacts = 
            {
                WorkPhone : string
                MobilePhone : string
            }
        
    }

Run Code Online (Sandbox Code Playgroud)

bri*_*rns 5

可以使用匿名记录创建嵌套类型:

type Customer = 
    {
        FirstName : string
        Contacts :
            {|
                WorkPhone : string
                MobilePhone : string
            |}
    }

let customer =
    {
        FirstName = "John"
        Contacts =
            {|
                WorkPhone = "123-456-7890"
                MobilePhone = "234-567-8901"
            |}
    }
Run Code Online (Sandbox Code Playgroud)


小智 2

您可以在代码中看到一些模式,但记录与字典不同。您可以将它们视为具有强类型公共属性的类。如果您需要创建字典,则必须使用可用的地图/字典类之一或实现您自己的。例如,看看 Map 类型。 https://fsharp.github.io/fsharp-core-docs/reference/fsharp-collections-fsharpmap-2.html

type Contact = 
    {
        WorkPhone : string
        MobilePhone : string
    }

type Customer = 
    {
        FirstName : string
        Contacts : Contact
    }


let cust : Customer = 
    { 
      FirstName = "Joe"
      Contacts = { WorkPhone="1800131313"; MobilePhone="0863331311" } 
    }

Run Code Online (Sandbox Code Playgroud)

上面的代码显示您可以嵌套记录类型。除了按照 @brianberns 建议使用匿名记录之外,您还可以声明您计划嵌套的数据类型。