好的,我有这种新类型
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
答案 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
如果您使用Geburtstag
和Eintrag
上的命名字段,就像使用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