如何访问Elm的联盟领域?

Che*_*ale 4 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]
Run Code Online (Sandbox Code Playgroud)

我不能用,p1.name因为p1不是记录.我如何进入该领域fnamep1还是p2

Apa*_*hka 7

网站上的文档仍在不断改进,需要在不同部分之间建立更多链接.您正在寻找的文档就在这里.

案例表达

相关部分解释了联合类型可以具有不同的标记值,因此您需要使用case-expression来区分不同的选项:

case p1 of
  Person r -> r.fname
Run Code Online (Sandbox Code Playgroud)

让表达

因为在您的情况下只有一个选项,您还可以在变量赋值中安全地使用解构模式:

(Person p1Record) = p1
-- now p1Record is defined, and you can use p1Record.fname
Run Code Online (Sandbox Code Playgroud)

小心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
Run Code Online (Sandbox Code Playgroud)

最后的说明

由于您的联合类型只有一个标记,因此您可能需要考虑使用type alias.它只是为类型编写更好的名称的实用程序,但您不必打开它来使用内部类型:

type alias Person 
  = {fname: String, lname: String, age: Int}

p1 = {fname= "ABC", lname= "XYZ", age= 23}
-- p1.fname is immediately accessible
Run Code Online (Sandbox Code Playgroud)