我正在研究一個資料型別,它涉及一個人的名字和姓氏,他們的方向和他們居住的城市。我做了一個列印這個的函式,但我很確定我可以以某種方式實體顯示或創建另一個類和實體它。我有一個叫做方向的資料型別:
type Direction = (Person, Dir, City)
type Name = String
type Surname = String
type City = String
data Person = Per Name Surname
data Dir = Street String Int | House String
而這兩個要素:
dirJon:: Direction
dirJon = (Per "Jon" "Prieto", House "Enea", "Orio")
dirMiren:: Direction
dirMiren = (Per "Miren" "Artola", Street "Aldamar" 15, "Donostia")
所以我想出的函式是:
write:: [Direction] -> IO()
write [] = return ()
write ((Per a b,Street c d, e):cs) = do
putStrLn ( a ' ': b)
putStrLn ("c/" c 'c':show d)
putStrLn e
write cs
write ((Per a b,House c, e):cs) = do
putStrLn ( a ' ': b)
putStrLn ("House " c)
putStrLn e
write cs
這導致了正確的實作,這意味著如果我write [dirJon,dirMiren]正確呼叫prints :
Jon Prieto
casa Enea
Orio
Miren Artola
c/Aldamarc15
Donostia
(在不同的方面,我不想用這個做紙)。
因此,如果有人可以幫助我以某種方式創建它的實體,因為我已經嘗試創建一個使用 [Direction] 作為引數的類,但由于它是一種型別而不是資料,我無法做到。
uj5u.com熱心網友回復:
您不能為型別別名定義實體。我只想定義一個適當的資料型別。
type Name = String
type Surname = String
type City = String
data Person = Per Name Surname
data Location = Street String Int | House String
data Address = Address Person Location City
addrJon, addrMiren :: Address
dirJon = Address (Per "Jon" "Prieto") (House "Enea") "Orio"
dirMiren = Address (Per "Miren" "Artola") (Street "Aldamar" 15) "Donostia"
instance Show Person where
show (Per x y) = x " " y
instance Show Location where
show (Street name number) = "c/" name "c" show number
show (House name) = "House " name
instance Show Address where
show (Address p l c) = show p "\n" show l "\n" c
write :: [Address] -> IO()
write [] = return ()
write (a:as) = putStrLn (show a) >> write as
-- write = traverse print
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/379197.html
