使用镜头实现ensureRecAFlag
函数的简洁方法是什么?
- 如果RecB包含具有
recaFlag=True
的RecA,则不执行任何操作 - 否则,如果RecB包含具有
recaName="internal_code"
的RecA,则为该RecA设置recaFlag=True
- 否则,如果RecB包含具有
recaName="id"
的RecA,则为该RecA设置recaFlag=True
- 否则,什么都不做
ensureRecAFlag :: RecB -> RecB
ensureRecAFlag = _todo
data RecA = RecA
{ recaName :: !Text
, recaValue :: !Int
, recaFlag :: !Bool
}
$(makeLensesWith abbreviatedFields ''RecA)
data RecB = RecB
{ recbName :: !Text
, recbRecAList :: ![RecA]
}
$(makeLensesWith abbreviatedFields ''RecB)
1条答案
按热度按时间iezvtpos1#
我建议您创建一个monoid来捕获您的变更层次结构。
现在,您可以独立地检查记录并将其修改后的表单注入到该类型中。
您的顶级函数现在很简单。
这个解决方案没有透镜,但它确实有一些很好的特性:它只遍历列表一次;它只使用初级的Haskell特性,所以当需求改变时,它可以直接读取和更新(如果不一定容易的话);并且其结构化使得在没有任何变化时返回传递的确切对象而不是新分配的副本变得方便。