能否消除Haskell实例歧义,实现跨版本配置自动迁移?
Haskell配置版本迁移的实例歧义问题
某应用的配置结构历经多次变更,为提升用户体验需支持各版本配置间的自动迁移。相关代码通过参数化的VersionedConfig类型表示不同版本的配置,且已实现相邻版本(V1→V2、V2→V3)的MigrateableFromTo实例。
尝试编写可组合中间迁移步骤的归纳MigrateableFromTo实例以实现跨版本迁移时,因from、intermediate、to可能为同一类型,出现实例歧义导致代码无法编译。编译错误信息如下:
Main.hs:44:12: error: • Overlapping instances for MigrateableFromTo intermediate0 'V3 arising from a use of ‘applyMigration’ Matching instances: instance (MigrateableFromTo from intermediate, MigrateableFromTo intermediate to) => MigrateableFromTo from to -- Defined at Main.hs:32:10 instance MigrateableFromTo 'V2 'V3 -- Defined at Main.hs:29:10 (The choice depends on the instantiation of ‘intermediate0’ To pick the first instance above, use IncoherentInstances when compiling the other instance declarations) • In the expression: (applyMigration cv1) :: VersionedConfig V3 In an equation for ‘cv3’: cv3 = (applyMigration cv1) :: VersionedConfig V3 In the expression: do let cv1 = CV1 5 cv3 = ... print cv3 | 44 | cv3 = (applyMigration cv1) :: VersionedConfig V3 | ^^^^^^^^^^^^^^
请问能否通过消除该歧义使代码正常编译?
内容的提问来源于stack exchange,提问作者notquiteamonad
相关产品推荐
相关产品推荐

