gpt4 book ai didi

haskell - 如何解决无法使用存在类型的镜头?

转载 作者:行者123 更新时间:2023-12-04 14:46:17 24 4
gpt4 key购买 nike

我正在使用 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] 中解释的原因,这不起作用。如果我通过编译 -ddump-splices 向 GHC 询问调试信息,我得到:
Haskell/Main.hs:1:1: Splicing declarations
makeLenses ''AnyFile ======> Haskell/Main.hs:59:1-20

拼接本身是空白的,这向我表明它没有产生任何声明。这部分是我期待并理解的,因为我已经阅读了 [1]。

我想知道的是如何做到这一点 - 我可以做些什么来解决这个问题?我可以做些什么来避免在这个上游游泳?我希望能够通过组合镜头路径访问我的结构的任何部分,但是因为我有其他类型的字段,例如 Set AnyFile , 除非我可以访问 AnyFile 的内容,否则我不能这样做用镜头。

[1] Existential quantifier silently disrupts Template Haskell (makeLenses). Why?

最佳答案

在最坏的情况下,您始终可以自己实现镜头,而完全不依赖 Template Haskell。

例如,给定类型的 getter 和 setter 函数,您可以使用 lens 创建镜头。功能:

 lens :: (s -> a) -> (s -> b -> t) -> Lens s t a b

我相信这可能不是最高效的选择,但它肯定是最简单的。

我不知道如何为您的情况(或一般存在类型)执行此操作,但这是一个使用记录的简单示例:
data Foo = Foo { _field :: Int }
foo = lens _field (\ foo new -> foo { _field = new })

希望这足以很好地说明这个想法以应用于您的代码。

关于haskell - 如何解决无法使用存在类型的镜头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18061747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com