我第一次使用 Edward Kmett 的镜头库,发现它相当不错,但我遇到了障碍......
[1] 中的问题解释了存在量词破坏了 makeLenses。我真的很想以某种方式使用带有镜头的存在主义。
作为背景,我有课:
class (TextShow file, Eq file, Ord file, Typeable file) => File file where
fromAnyFile :: AnyFile -> Maybe file
fileType :: Simple Lens file FileType
path :: Simple Lens file Text.Text
provenance :: Simple Lens file Provenance
对于实际问题,我想要类型:
data AnyFile = forall file . File file => AnyFile { _anyFileAnyFile :: File }
我希望能够写一些类似的东西:
instance File AnyFile where
fromAnyFile (AnyFile file) = cast file
fileType (AnyFile file) = fileType . anyFile
path (AnyFile file) = path . anyFile
provenance (AnyFile file) = provenance . anyFile
由于 [1] 中解释的原因,这不起作用。如果我通过编译向 GHC 询问调试信息-ddump-splices
,我会得到:
Haskell/Main.hs:1:1: Splicing declarations
makeLenses ''AnyFile ======> Haskell/Main.hs:59:1-20
拼接本身是空白的,这向我表明它没有产生任何声明。这部分是我期待并理解的,因为我已经阅读了 [1]。
我想知道的是我该怎么做——我可以做些什么来解决这个问题?我可以做些什么来避免在这个上游游泳?我希望能够通过组合镜头的路径访问我的结构的任何部分,但是因为我有其他类型的字段,例如Set AnyFile
,除非我可以使用AnyFile
镜头访问 的内容,否则我不能这样做。