gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:24:12 26 4
gpt4 key购买 nike

我是一名 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 }

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

最佳答案

仅使用核心库?没有。但是随着广泛使用 lens 包裹,是的。您的情况如下:

{-# LANGUAGE TemplateHaskell #-}

import Control.Lens.TH
import Control.Lens

data Car = Car { _gas :: Int, _licensePlate :: String }

makeLenses ''Car

现在,您可以轻松获取/设置/修改嵌套在数据结构中的字段。

runOutOfFuel:: Car -> Car
runOutOfFuel = gas .~ 0

drive:: Car -> Car
drive = gas %~ (`div` 2)

refuel:: Int -> Car -> Car
refuel c = gas +~ c

这里的神奇之处在于makeLenses ''Car生成gaslicensePlate与您的 mapGas 类似(但更强大)的功能(事实上​​,mapGas = (gas %~))。开始使用 lens是相当令人畏惧的,但我建议只阅读 examples部分。

关于haskell - Haskell 是否提供了将函数映射到数据成员的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43241259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com