I am learning the programming language Elm. I want to access a particular field of a union. I am unable to access it. I have searched in the documentation. But I could not find anywhere how to access a particular field of a Union. The code is as follows:
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]
I cannot use p1.name
since p1
is not a record. How do I access the field fname
of p1
or p2
?
The documentation on the website is still getting improved, and need some more links between different parts. The documentation you're looking for is here.
The relevant part explains that a union type can have different tagged values, so you need a case-expression to distinguish the different options:
case p1 of
Person r -> r.fname
Since in your case there is only one option, you can also safely use a deconstruction pattern in a variable assignment:
(Person p1Record) = p1
-- now p1Record is defined, and you can use p1Record.fname
Note that if you use this assignment trick for a union type with multiple tags, you open your program up to runtime crashes. The crash will happen if the value you try to deconstruct is not of the right tag:
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
Since your union type has only one tag, you may want to consider using a type alias
instead. It's just a utility to write a nicer name for a type, but you don't have to unwrap it to use the inner type:
type alias Person
= {fname: String, lname: String, age: Int}
p1 = {fname= "ABC", lname= "XYZ", age= 23}
-- p1.fname is immediately accessible
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With