2016-03-13 102 views
-2

如果我已經定義了一個數據類型,比方說5個屬性。我將如何能夠創建一個屬性的列表。如何從給定數據類型的列表中提取字段列表?

例:

data Person = Person name fname sexe age height 

Marie, John, Jessie :: Person 
Marie = Person "Marie" _ _ _ 
John = Person "John" _ _ _ 
Jessie = Person "Jessie" _ _ _ 

我怎樣才能返回一個包含所有名字的列表:(MarieJohnJessie

回答

6

你的代碼是無效的Haskell。你可以有

data Person = Person FName LName Sexe Age Height 
type FName = String 
type LName = String 
data Sexe = Male | Female 
type Age = Int 
type Height = Float 

marie, john, jessie :: Person 
marie = Person "Marie" "Lastname1" Female 25 165 
john = Person "John" "Lastname2" Male 26 180 
jessie = Person "Jessie" "Lastname3" Female 27 170 

然後,你可以創建一個包含三個值mariejohn,並jessie列表以及

db :: [Person] 
db = [marie, john, jessie] 

現在你可以使用許多內置的功能,如mapfilter這個名單上運行:

getAge :: Person -> Age 
getAge (Person _ _ _ age _) = age 

ages :: [Person] -> [Age] 
ages people = map getAge people 

現在,如果你加載到GHCi你可以測試這個作爲

> ages db 
[25, 26, 27] 

需要注意以下幾點:如果他們沒有在建

  • 所有數據類型必須聲明
  • data TypeName = ConstructorName <FieldTypes>
  • 聲明類型別名聲明新類型的type AliasName = ExistingType
  • 類型名稱和構造函數必須以大寫字母開頭
  • 數值名稱必須以小寫字母開頭。
+0

謝謝!但我想要的是返回一個列表(瑪麗,約翰,傑西)......在他們的名字列表中......而不是列表中的對象。 – Caro

+3

@Caro創建一個接受'Person'並返回'FName',然後使用'map'的函數。我會讓你自己寫一個「年齡」的例子,它應該是相當簡單的。 – bheklilr

1

您可以map在與提取名稱的功能列表:

map (\ (Person name _ _ _ _) -> name) people 

而且如果你的數據類型被定義爲記錄,像這樣:

data Person = Person 
    { personName, personFName, personSex :: String 
    , personAge, personHeight :: Int 
    } 

然後你可以簡單地說map personName people