1

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

    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

4

2 回答 2

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)会从一个人中提取geburtstag。从那里,您可以定义函数,例如:

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

然后getDay (geburtstag (getPerson myEintrag)),或等效地,getDay . geburtstag . getPerson $ myEintrag将让您从 Eintrag 获得一天。

于 2013-11-11T16:18:42.507 回答
0
    getGtag :: Person -> Geburtstag
    getGtag (Pers a b c) = c
于 2013-11-11T16:38:15.700 回答