gpt4 book ai didi

haskell - 在状态计算中使用 Lens.Family.LensLike' 作为 setter 和 getter

转载 作者:行者123 更新时间:2023-12-01 11:38:11 29 4
gpt4 key购买 nike

我会在有状态计算中使用与 setter 和 getter 相同的镜头。并且 GHC 似乎无法推断出 Functor f 的通用类型。

import Lens.Family
import Lens.Family.State
import Control.Monad.State

-- | Run computation inside modified state
with :: Functor f => LensLike' f s a -> a -> State s b -> State s b
with lens value comp = do
value' <- use lens
lens .= value
res <- comp
lens .= value'
return res

所以我的问题是,是否有可能实现这种行为,或者我应该为 setter 和 getter 使用单独的镜头?谢谢!

最佳答案

这里有几个选项。首先,您可以使用 RankNTypes,以便可以在每个“调用站点”使用不同的 Functor 实例,确保您可以将 LensLike' 用作 getter 和 setter:

with :: (forall f. Functor f => LensLike' f s a) -> a -> State s b -> State s b

其次,可能更好,是使用已经存在的 Lens 类型——允许同时用作 getter 和 setter。

with :: Lens' s a -> a -> State s b -> State s b

您必须允许 Functor 在不同的“调用站点”之间变化,因为选择特定的 Functor 会将镜头更改为 getter 或 setter。 Identity Functor 用于设置,Const functor 用于获取。

关于haskell - 在状态计算中使用 Lens.Family.LensLike' 作为 setter 和 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184290/

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