5

なぜこれが機能するのだろうか

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]

どうすれば修正できますか?

4

1 に答える 1

8

コンストラクターは一般にカリー化された関数のように機能するため、最初の例のように部分的に適用できますが、レコード構文の構築では、フィールドが省略されていない完全なレコードを構築したいと考えています。

それでもフィールドに名前を付けたい場合は、ラムダを使用できます。

map (\age -> PersonContructor {firstName="firstName1", lastName="lastName1", age=age}) [666, 999]
于 2013-08-09T08:24:15.723 に答える