5

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?

4

1 回答 1

8

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]
于 2013-08-09T08:24:15.723 回答