我有基于lens
的代码,需要某种数据结构:
makeLenses ''Pool
...
pool ^. objects ^? _head :: Maybe Object
此代码假定:
objects ::
Functor f =>
([Object] -> f [Object]) -> Pool -> f Pool
但我想向结构中引入新信息,新镜头将成为:
objects ::
Functor f =>
([DebugInfo Object] -> f [DebugInfo Object]) -> Pool -> f Pool
我的目标是避免对现有代码进行任何更改,就好像它是维护中的复杂项目一样。
由于我使用lens
库,我认为应该可以提供一个提供“backported”objects
镜头的新模块,这样我就不需要更改旧代码了(除了导入之外)
这种看似合理的方法吗?某处潜伏着某种限制吗?我们会想到类型类或模块系统。我还怀疑我可能遇到旧代码无法“重建”新结构的问题。我需要行类型多态来做到这一点吗?
最后,如果可以这样做,我应该如何构建我的模块以保持适当的分离?
答案 0 :(得分:1)
我不确定为什么你需要修改MainActivity
函数而不是创建一个新函数。但是,对于您的上一个问题:旧代码重构新结构,标准方法是使用默认值并使用此值构建任何新值并对其进行修改,例如
onActivtyResult()
这样,当您向objects
添加新字段时,您只需要升级data Foo = Foo { foo :: String, bar :: Int }
fooDef = Foo "" 0
newFoo :: String -> Int -> Foo
newFoo f b= fooDef { foo = f, bar = b }
。但是,最好不要使用它,并在它破坏时手动更新代码。这就是你毕竟使用静态打字的原因,不是吗?