小编o19*_*673的帖子

Haskell是否提供了将函数映射到数据成员的方法?

我是Haskell的新手,我经常发现自己不得不用模式匹配来分解数据,只是将一个函数应用于其成员之一,然后重新组装它.

说我有:

data Car = Car { gas :: Int, licensePlate :: String }
Run Code Online (Sandbox Code Playgroud)

我希望它在开车时减半燃气,并加油,我正在做:

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 . (+)
Run Code Online (Sandbox Code Playgroud)

有没有办法在不必定义辅助函数mapGas的情况下做到这一点?因为当它由许多字段组成时,必须为每个数据成员编写一个map函数会变得相当麻烦.我知道可以为具有访问者的其中一个成员分配一个值:

runOutOfFuel:: Car -> Car
runOutOfFuel aCar = aCar { gas = 0 }
Run Code Online (Sandbox Code Playgroud)

是否可以使用访问器映射函数?如果是这样,怎么样?

haskell records functional-programming

12
推荐指数
1
解决办法
579
查看次数

标签 统计

functional-programming ×1

haskell ×1

records ×1