访问新的数据类型元素

时间:2013-11-11 16:09:43

标签: haskell

好的,我有这种新类型

    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

2 个答案:

答案 0 :(得分:1)

假设你有:

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)会从Person中提取geburtstag。从那里,您可以定义以下函数:

getDay :: Geburtstag -> Int
getDay (Gtg d _ _) = d

然后getDay (geburtstag (getPerson myEintrag)),或等同地,getDay . geburtstag . getPerson $ myEintrag会让你从Eintrag获得一天。

答案 1 :(得分:0)

    getGtag :: Person -> Geburtstag
    getGtag (Pers a b c) = c