Haskell 访问新的数据类型元素

Haskell 访问新的数据类型元素,haskell,Haskell,好的,我有这种新型的 data Person = Pers { vorname, nachname :: String, geburtstag :: Geburtstag } deriving (Eq, Show) 与 我需要知道如何访问元素,比如geburtstag和来自它的元素(tag、monat、jahr) 例如,我得到一个Eintrag,我需要从geburtstag访问geburtstag,甚至是Monat,假设您有: myDate = Gtg 7 Ja

好的,我有这种新型的

    data Person = Pers {
    vorname,
    nachname :: String,
    geburtstag :: Geburtstag } deriving (Eq, Show)

我需要知道如何访问元素,比如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 myeintag
将返回
myPerson

您不需要编写函数来从一个人身上提取geburtstag;命名字段将自动提供该函数。因此
geburtstag(getPerson-myEintrag)
将从一个人身上提取geburtstag。在此基础上,您可以定义以下函数:

getDay :: Geburtstag -> Int
getDay (Gtg d _ _) = d
然后
getDay(geburtstag(getPerson-myeintag))
,或者相当于
getDay。格伯茨塔格。getPerson$MyIntrag
将从Eintrag获取当天的信息。

假设您有:

myDate = Gtg 7 Jan 2013
myPerson = Person "Joe" "Bloe" myDate
myEintrag = (myPerson, ???, ???) -- I don't know what Anschrift and SozNr look like
    getGtag :: Person -> Geburtstag
    getGtag (Pers a b c) = c
以下是您如何访问它们的一些示例:

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 myeintag
将返回
myPerson

您不需要编写函数来从一个人身上提取geburtstag;命名字段将自动提供该函数。因此
geburtstag(getPerson-myEintrag)
将从一个人身上提取geburtstag。在此基础上,您可以定义以下函数:

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

然后
getDay(geburtstag(getPerson-myeintag))
,或者相当于
getDay。格伯茨塔格。getPerson$MyIntrag
可以从Eintrag获取当天的信息。

好的,但我只有MyIntrag如何从中访问Geburtstag。我做了第一个函数,从Eintrag给我Person,但现在我不知道如何从Person获取Geburtstag,因为它与模式匹配不起作用。好的,但我只有MyIntrag如何从它访问Geburtstag。我做了第一个函数,从Eintrag给我Person,但现在我不知道如何从Person获取Geburtstag,因为它不适用于模式匹配。您不需要这个函数,因为
Person
的字段都是命名的。因此
geburtstag p
返回
p
geburtstag
。您不需要此函数,因为
Person
的字段已命名。因此
geburtstag p
返回
p
geburtstag
    getGtag :: Person -> Geburtstag
    getGtag (Pers a b c) = c