如何访问 Elm 中的联合字段?
How to access fields of a Union in Elm?
我正在学习编程语言 Elm。我想访问工会的特定领域。我无法访问它。我在文档中搜索过。但我无法在任何地方找到如何访问联盟的特定领域。代码如下:
import Graphics.Element exposing (show)
import List exposing (length, filter, map)
type Person
= Person { fname: String, lname: String, age: Int}
p1 = Person { fname="ABC", lname="XYZ", age=23 }
p2 = Person { fname="JK", lname="Rowling", age=24 }
-- These are unions with fields
people : List Person
people = [ p1
, p2
, Person {fname= "Anakin", lname= "Luke", age= 12}
]
main = show [people]
我不能使用 p1.name
,因为 p1
不是记录。如何访问 p1
或 p2
的字段 fname
?
网站上的文档仍在改进中,不同部分之间需要更多链接。您要查找的文档是 here。
大小写表达式
相关部分解释了联合类型可以有不同的标记值,所以你需要一个case-expression来区分不同的选项:
case p1 of
Person r -> r.fname
让表达式
因为在你的情况下只有一个选项,你也可以安全地在变量赋值中使用解构模式:
(Person p1Record) = p1
-- now p1Record is defined, and you can use p1Record.fname
小心 let 表达式
请注意,如果您将此赋值技巧用于具有多个标记的联合类型,您的程序将面临运行时崩溃。如果您尝试解构的值不是正确的标记,则会发生崩溃:
type Direction
= Left
| Right
| Forward
| Back
march : Direction -> Boolean
march dir =
let
Forward = dir -- contrived example
in
True
main =
show (march Back) -- oops, runtime crash
最后的笔记
由于您的联合类型只有一个标签,您可能需要考虑改用 type alias
。它只是一个为类型写一个更好的名字的实用程序,但你不必打开它来使用内部类型:
type alias Person
= {fname: String, lname: String, age: Int}
p1 = {fname= "ABC", lname= "XYZ", age= 23}
-- p1.fname is immediately accessible
我正在学习编程语言 Elm。我想访问工会的特定领域。我无法访问它。我在文档中搜索过。但我无法在任何地方找到如何访问联盟的特定领域。代码如下:
import Graphics.Element exposing (show)
import List exposing (length, filter, map)
type Person
= Person { fname: String, lname: String, age: Int}
p1 = Person { fname="ABC", lname="XYZ", age=23 }
p2 = Person { fname="JK", lname="Rowling", age=24 }
-- These are unions with fields
people : List Person
people = [ p1
, p2
, Person {fname= "Anakin", lname= "Luke", age= 12}
]
main = show [people]
我不能使用 p1.name
,因为 p1
不是记录。如何访问 p1
或 p2
的字段 fname
?
网站上的文档仍在改进中,不同部分之间需要更多链接。您要查找的文档是 here。
大小写表达式
相关部分解释了联合类型可以有不同的标记值,所以你需要一个case-expression来区分不同的选项:
case p1 of
Person r -> r.fname
让表达式
因为在你的情况下只有一个选项,你也可以安全地在变量赋值中使用解构模式:
(Person p1Record) = p1
-- now p1Record is defined, and you can use p1Record.fname
小心 let 表达式
请注意,如果您将此赋值技巧用于具有多个标记的联合类型,您的程序将面临运行时崩溃。如果您尝试解构的值不是正确的标记,则会发生崩溃:
type Direction
= Left
| Right
| Forward
| Back
march : Direction -> Boolean
march dir =
let
Forward = dir -- contrived example
in
True
main =
show (march Back) -- oops, runtime crash
最后的笔记
由于您的联合类型只有一个标签,您可能需要考虑改用 type alias
。它只是一个为类型写一个更好的名字的实用程序,但你不必打开它来使用内部类型:
type alias Person
= {fname: String, lname: String, age: Int}
p1 = {fname= "ABC", lname= "XYZ", age= 23}
-- p1.fname is immediately accessible