【问题标题】:Readonly lens for a function一个函数的只读镜头
【发布时间】:2018-03-02 14:03:33
【问题描述】:

我有一个类似的案例类:

case class Person(name,birthDate, many other fields) { def something = //根据字段计算 }

最后我真正想要的是为 name、birthDate 和 readonly 镜头提供镜头,如果可能的话,将它们组合在一起以有一个镜头来设置 name/birthDate 和读取 name/birthDate/something

从我有限的知识来看,这似乎是不可能的(在 shapeless 中,我在为某功能创建镜头时遇到错误)

也许在其他镜头库中是可能的,或者我需要进行重构

【问题讨论】:

    标签: scala functional-programming shapeless


    【解决方案1】:

    考虑到光学器件通常解决双向访问的问题(如果可能,获取/设置某些东西),没有像 只读镜头这样的东西。

    所以,无论你使用 shapeless 还是 Monocle 或其他东西,你都不能这样做。

    但是,没有什么能阻止你这样做:

    // updates person
    (lens1 composeLens lens2 composeLens personLens).modify(...)
    // gets Person and reads "read only" property
    (lens1 composeLens lens2 composeLens personLens).get(object).something 
    

    关于一般光学,有一篇很好的文章介绍了它们以及如何将它们与 Monocles 一起使用。

    编辑。好吧,也许你可以设计一些具有“只读”光学器件的东西——那就是 Prism,它总是无法更新,但我相信这将是对这个想法的可怕憎恶。然后你不会在 Person 上工作,而是在 Person 的一些副产品上工作,但这会很尴尬地违反直觉,所以我什至没有开始思考如何实现它。

    【讨论】:

    • Monocle 确实定义了一个可能与此处相关的Getter 光学元件。
    • 好吧,可以定义 Setter 以使用 ??? 并手动创建镜头,无需宏或派生。但是那种破坏使用函数式风格的目的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多