我是一名Haskell新手,我經常發現自己不得不使用模式匹配來分解數據,只將函數應用於其成員之一,然後重新組裝它。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 }
是否有可能將函數映射到訪問器?如果是這樣,怎麼樣?
我想你應該看看一些'鏡頭'教程https://hackage.haskell.org/package/lens – epsilonhalbe
只爲了記錄,沒有鏡頭,我認爲你可以做的最好的是'mapGas f = (\汽車 - >汽車{汽車= f(汽車)})'。這至少避免提及其他領域。 – chi
@chi我通常在這些情況下做的是儘量保持對稱性:'mapGas f =(\ car @ Car {gas = g} - > car {gas = f g})''。時間越長,但你可以在' - >'兩側看到'gas'字段。 – Alec