假设有两种数据类型:
type alias Player =
{ name : String
, team : Team
}
type alias Team =
{ name : String
, players : List Player
}
Run Code Online (Sandbox Code Playgroud)
这个JSON:
{
"players": [
{ "id": 100, "name": "Sam Bradford", "teamId": 200 },
{ "id": 101, "name": "Kyle Rudolph", "teamId": 200 },
{ "id": 102, "name": "Matthew Stafford", "teamId": 201 },
{ "id": 103, "name": "Marvin Jones Jr.", "teamId": 201 },
{ "id": 104, "name": "Golden Tate", "teamId": 201 },
],
"teams": [
{ "id": 200, "name": "Minnesota Vikings" },
{ "id": 201, "name": "Detroit Lions" },
]
}
Run Code Online (Sandbox Code Playgroud)
很明显,这个JSON可以被解码成非空的链接对象,这可以由JSON解码器在解码数据时确定.有没有办法解码这个JSON并创建链接的数据结构?我不确定如何使用纯粹的不可变数据结构,或者如果可能的话.
有一个在榆树递归数据类型的一个很好的解释在这里.
如果您尝试编译数据类型,则会收到以下错误:
-- ALIAS PROBLEM ---------------------------------------------------------------
This type alias is part of a mutually recursive set of type aliases.
4|>type alias Player =
5|> { name : String
6|> , team : Team
7|> }
The following type aliases are mutually recursive:
???????
? V
? Player
? ?
? V
? Team
???????
You need to convert at least one `type alias` into a `type`. This is a kind of
subtle distinction, so definitely read up on this before you make a fix:
<https://github.com/elm-lang/elm-compiler/blob/0.17.0/hints/recursive-alias.md>
Run Code Online (Sandbox Code Playgroud)
你也可以用另一种方式处理这个问题.我更喜欢求助于ID参考,例如
type alias ID = Int
type alias PlayerList = Dict ID PLayer
type alias TeamList = Dict ID Team
type alias Player =
{ name : String
, teamID : ID
}
type alias Team =
{ name : String
, players : List ID
}
Run Code Online (Sandbox Code Playgroud)
更新:您还在null提问中提及参考文献.在上面的数据类型中,每个玩家必须有一个团队.如果团队是可选字段,我将定义如下:
type alias Player =
{ name : String
, teamID : Maybe ID
}
Run Code Online (Sandbox Code Playgroud)
对于List和String类型,你真的不需要这种Maybe类型.使用[](空列表)和""(空字符串)更容易为那些空状态.
PS:另一个假设是你需要在你的模型的每个团队中存储团队成员列表.因为严格来说你不需要:玩家列表已经拥有找出哪些玩家(如果有的话)属于X队所需的所有数据.请注意这是很多工作(并且可能导致讨厌的错误)如果你保持双向参考:如果一个球员切换球队,你需要更新3个记录(1个球员+ 2个球队记录).
| 归档时间: |
|
| 查看次数: |
388 次 |
| 最近记录: |