我有一个包含很多字段的数据类型:
data ManyFields a b c d .. = MF { f1 :: a, f2 :: b, f3 :: c .. }
问题一
如何将函数映射到每个字段,同时避免map
为每个字段实现一个函数。例如,这看起来非常乏味且不习惯:
-- | Note I am explicitly constructing ManyField after mapping a function onto the field
-- | This looks bad
mapf1 :: (a -> a1) -> ManyFields a b c .. -> ManyFields a1 b c ..
mapf1 g mf = MF (g . f1 $ mf) (f2 mf) ..
-- | Repeat for each field
mapf2 :: (b -> b1) -> ManyFields a b c .. -> ManyFields a b1 c ...
我认为某种抽象出模式的高阶函数constructor . (mapfunction f)
会减少样板文件,但是有更好的解决方案吗?
问题二
如果我想将许多 ManyFields 压缩在一起并将任意数量的函数映射到每个字段上,这听起来像是某种类型类的实例吗?
用例:
(==) `mapFunction` mf1 `pairWiseZipField` mf2
它对我来说有点像一个应用程序,但我再次不确定如何fmap
在这种类型上实现。