好的,所以我有这个新类型
data Person = Pers {
vorname,
nachname :: String,
geburtstag :: Geburtstag } deriving (Eq, Show)
跟
type Tag = Int
data Monat = Jan | Feb | Mar | Apr | Mai | Jun | Jul | Aug | Sep | Okt | Nov | Dez deriving (Eq, Show)
type Jahr = Int
data Geburtstag = Gtg Tag Monat Jahr deriving (Eq, Show)
type Eintrag = (Person, Anschrift, SozNr)
我需要知道如何访问元素,例如Geburtstag和来自它的元素(tag,monat,jahr)
例如,我得到了一个Eintrag,我需要从geburtstag访问geburtstag甚至Monat
假设你有:
myDate = Gtg 7 Jan 2013
myPerson = Person "Joe" "Bloe" myDate
myEintrag = (myPerson, ???, ???) -- I don't know what Anschrift and SozNr look like
以下是您如何访问它们的一些示例:
putStrLn $ show (vorname myPerson)
putStrLn $ show (nachname myPerson)
let (a, _, _) = myEintrag
putStrLn $ show (nachname a)
let (Gtg d m y) = geburtstag a
putStrLn $ show y
如果在Geburtstag
和Eintrag
上使用命名字段,就像使用Person
一样,则可能会更方便(具体取决于您的应用程序)。否则,您必须在这些字段上进行模式匹配,就像我在这里所做的那样。
编辑:你说你已经有了getPerson,我认为它看起来像这样:
getPerson :: Eintrag -> Person
getPerson (p, _, _) = p
所以在我的示例中,getPerson myEintrag
会返回myPerson
.
你不需要编写一个函数来从一个人身上提取geburtstag;命名字段会自动给你这个函数。所以geburtstag (getPerson myEintrag)
会从一个人身上提取出格伯茨标签。从那里,您可以定义以下函数:
getDay :: Geburtstag -> Int
getDay (Gtg d _ _) = d
然后getDay (geburtstag (getPerson myEintrag))
,或者等同地,getDay . geburtstag . getPerson $ myEintrag
会让你从Eintrag获得一天。
getGtag :: Person -> Geburtstag
getGtag (Pers a b c) = c