Haskell 构造函数的记录语法

Haskell 构造函数的记录语法,haskell,Haskell,我想知道这为什么有效 data Person = PersonContructor { firstName :: String, lastName :: String, age :: Int } deriving (Show) main = putStrLn $ show $ map (PersonContructor "firstName1" "lastName1") [666, 999] 但事实并非如此 data Person = PersonContructor { f

我想知道这为什么有效

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

main = putStrLn $ show $ map (PersonContructor "firstName1" "lastName1") [666, 999]
但事实并非如此

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

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

如何修复它?

虽然构造函数的行为通常类似于curried函数,因此您可以像在第一个示例中一样部分地应用它们,但记录语法构造希望构造一个完整的记录,而不遗漏任何字段

如果仍要命名字段,可以使用lambda:

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

或者为了方便起见,使用
-XRecordWildCards
,然后使用
\age->PersonConstructor{firstName=“firstName1”,lastName=“lastName1”,…}
用作用域中相同名称的变量填充其余字段。为完整起见,还有和
\age->personcontractor{firstName=“firstName1”,lastName=“lastName1”,age}
;由于写入
age
时没有等号,因此启用此标志后,它就成为
age=age
的缩写。