Alan Coromano
Alan Coromano

Reputation: 26008

Record syntax for a constructor

I wonder why does this work

data Person = PersonContructor {
  firstName :: String,
  lastName :: String,
  age :: Int
} deriving (Show)

main = putStrLn $ show $ map (PersonContructor "firstName1" "lastName1") [666, 999]

and this doesn't

data Person = PersonContructor {
  firstName :: String,
  lastName :: String,
  age :: Int
} deriving (Show)

main = putStrLn $ show $ map (PersonContructor {firstName="firstName1", lastName="lastName1"}) [666, 999]

and how do I fix it?

Upvotes: 5

Views: 1141

Answers (1)

firefrorefiddle
firefrorefiddle

Reputation: 3805

While Constructors act like curried functions in general, so you can partially apply them as in your first example, the record syntax constructing wants to construct a complete record with no fields left out.

If you want to name the fields nevertheless, you can use a lambda:

map (\age -> PersonContructor {firstName="firstName1", lastName="lastName1", age=age}) [666, 999]

Upvotes: 8

Related Questions