gpt4 book ai didi

haskell - 仅当输入值为 "setter"时应用镜头 "Just x"?

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

有什么方法可以应用 Control-Lens-Setter.html#g:4 中提到的组合器/ setter 吗?当输入值(不是正在设置的字段)是Just x时?

例如,考虑 (~+) 组合器,如果我有以下内容:

let target = (1, 2)
input1 = Just 10
input2 = Nothing

我想要一个执行以下操作的 setter:

(11, 2) == target & (_1 . someSetter) +~ input1 
& (_2 . someSetter) +~ input2

在这种情况下,我试图避免使用 fmapmaybe/fromMaybe,因为我有很多这样的操作要做,并且宁愿避免样板通过利用镜头的简洁性。

最佳答案

您始终可以定义自己的 setter。

maybeSetter :: (b -> a -> a) -> ASetter s t a a -> Maybe b -> s -> t
maybeSetter g f x = runIdentity . f (Identity . maybe id g x)

(+!) :: Num a => ASetter s t a a -> Maybe a -> s -> t
(+!) = maybeSetter (+)

let target = (1, 2)
input1 = Just 10
input2 = Nothing
in
(11, 2) == target & (_1 . someSetter) +! input1
& (_2 . someSetter) +! input2

您还可以轻松定义其他 setter 。

(-!) :: Num a => ASetter s t a a -> Maybe a -> s -> t
(-!) = maybeSetter subtract

(||!) :: ASetter s t Bool Bool -> Maybe Bool -> s -> t
(||!) = maybeSetter (||)

(<>!) :: Semigroup a => ASetter s t a a -> Maybe a -> s -> t
(<>!) = maybeSetter (flip (<>))

(.!) :: ASetter s t a a -> Maybe a -> s -> t
(.!) = maybeSetter const

(%!) :: ASetter s t a a -> Maybe (a -> a) -> s -> t
(%!) = maybeSetter id

这就是镜头的妙处。它们只是常规函数。

关于haskell - 仅当输入值为 "setter"时应用镜头 "Just x"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58110197/

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