kak*_*akk 5 f# functional-programming
记录是否类似于字典,它是带有名称的对象树?或者记录只是简单类型的列表
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)
可以使用匿名记录创建嵌套类型:
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 建议使用匿名记录之外,您还可以声明您计划嵌套的数据类型。