gpt4 book ai didi

haskell - 使用 Lens,你如何将 setter 与另一个函数 g 组合起来,使得 g 的输出是要设置的新值?

转载 作者:行者123 更新时间:2023-12-03 14:24:01 33 4
gpt4 key购买 nike

简单的例子:

{-# LANGUAGE TemplateHaskell #-}

import Language.Haskell.TH
import Control.Lens

data Point = P { _x :: Double, _y :: Double } deriving (Show)
$( makeLenses ''Point )

这就是我试图以命令式风格做的事情:
point.set( "x", g (point.get("x") ) )

目前我尝试了这个实现:
mapF f p g = let v = g (p ^. f) in set f v p 

它不是一个实际的组合,不是惯用的,并且还会引发错误:
Couldn't match expected type `Mutator b0'
with actual type `Accessor a0 a0'
Expected type: ASetter s1 t0 a0 b0
Actual type: Getting a0 s0 a0

即使上述的非参数化版本也能工作:
mapX p g = let v = g (p^.x) in set x v p

似乎 f 可以是 getter 或 setter,而不是两者?

最佳答案

您想要 over函数,其类型专门用于这种情况:

over :: Setter a b -> (b -> b) -> a -> a

所以你只需写:
over x :: (Double -> Double) -> Point -> Point

关于haskell - 使用 Lens,你如何将 setter 与另一个函数 g 组合起来,使得 g 的输出是要设置的新值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17052924/

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