访问新的数据类型元素



好的,所以我有这个新类型

    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

如果在GeburtstagEintrag上使用命名字段,就像使用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

相关内容

最新更新