Я новичок Haskell, и мне часто приходится разлагать данные с помощью сопоставления с образцом только для применения функции к одному из ее членов, а затем для ее сборки.
Скажем, у меня есть:
data Car = Car { gas :: Int, licensePlate :: String }
и я хочу, чтобы он уменьшил наполовину свой газ, когда он водит, и заправьте его, я делаю:
mapGas:: (Int -> Int) -> Car -> Car
mapGas f (Car aGas aLicensePlate) = Car (f aGas) aLicensePlate
drive:: Car -> Car
drive = mapGas (flip div 2)
refuel:: Int -> Car -> Car
refuel = mapGas . (+)
Есть ли способ сделать это без определения вспомогательной функции mapGas? Так как может стать довольно назойливым, нужно написать функцию отображения для каждого члена данных, когда она сделана из многих полей. Я знаю, что можно назначить значение одному из членов с помощью аксессуаров:
runOutOfFuel:: Car -> Car
runOutOfFuel aCar = aCar { gas = 0 }
Можно ли также сопоставить функцию с аксессуарами? если да, то как?