haskell - 如何在嵌套数据结构的一部分上映射函数?
问题描述
我想在Float -> Float
看起来像这样的数据结构的一部分上映射一个类型的函数。
VDstruct { _onBuild = Just True
, _imageName = Just "arc.png"
, _category = Just "All"
, _mmo = Just 210
, _structTypes = Just
( Mage
{ _ict = Nothing
, _create = Just 1.24
, _sh = Nothing
}
}
我想将该功能应用于_ict
和。_create
_sh
我知道如何为其中的每一个做到这一点。我正在使用镜头来帮助我解决这个问题。结果_create = Just 5.4
正是我对plusXPercent
函数的期望。这就是我现在正在使用的。
setSer x = x & (structTypes . _Just . create) %~ fmap plusXPercent
我想要做的不是命名每个_ict
,_sh
等。我想要一种方法来“映射”整个Mage
结构上的功能。
我该怎么做呢?
编辑:_ict
,_create
并_sh
有类型Maybe Float
并且Mage
是这样定义的
data Mage = Mage { _ict :: Maybe Float
, _create :: Maybe Float
, _sh :: Maybe Float
} deriving Show
解决方案
如果要使用mono-traversable
包,可以MonoFunctor
为Mage
.
type instance Element Mage = Maybe Float
instance MonoFunctor Mage where
omap f (Mage x y z) = Mage (f x) (f y) (f z)
然后,您可以使用omap
(例如)应用fmap (+1)
到Mage
.
omap (fmap (+1)) (Mage { _ict = Nothing
, _create = Just 1.24
, _sh = Nothing
})
== Mage { _ict = Nothing, _create = Just 2.24, _sh = Nothing }
然后,我想,你会写(对不起,只是猜测,镜头不是我的强项):
--setSer x = x & (structTypes . _Just . create) %~ fmap plusXPercent
setSer x = x & (structTypes . _Just) %~ (omap (fmap plusXPercent))
但是,MonoFunctor
可能有点矫枉过正;Applicative
您可以使用函数的实例完成同样的事情。
foo :: (Maybe Float -> Maybe Float) -> Mage -> Mage
foo f = Mage <$> f . _ict <*> f . _create <*> f . _sh
推荐阅读
- c# - 在服务器上的 MSAL.NET 中,有没有办法为单点登录提供域提示?
- c++ - 如何使用 __builtin_ctz 加速二进制 GCD 算法?
- spring - 是否可以有一个由星号定义的 @Value 属性?
- node.js - Skill Bot-Microsoft Bot Framework v4-NodeJS 中的对话框
- python-3.5 - 及时定位图像并执行指令
- http-headers - 为主页设置缓存标头后强制浏览器重新加载
- java - 有没有办法在Java中初始化多个变量?
- firebase-storage - Flutter Web:firebase_storage:MissingPluginException找不到方法StorageReference#putData的实现
- xamarin.forms - Xamarin.Forms 使用 Flyout/Menu Item 作为标题并自定义 BG 颜色和文本颜色
- ios - Xamarin 本机 iOS 布局