函数的只读镜头
Readonly lens for a function
我有一个案例 class 比如:
case class Person(name, birthDate, many other fields) { def something = //根据字段计算 }
最后我真正想要的是拥有用于名称、出生日期的镜头和用于某物的只读镜头,并且如果可能的话将它们组合在一起以获得用于设置 name/birthDate 和读取 name/birthDate/东西
据我有限的知识,这似乎是不可能的(在 shapeless 中,我在为 something 函数创建镜头时遇到错误)
也许在其他镜头库中是可能的,或者我需要做一个重构
考虑到光学通常解决 two-way 访问问题(getting/settings 如果可能的话),没有 只读镜头 .
因此,无论您使用 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
关于一般的光学,有一篇很好的文章介绍了它们以及如何将它们与单片眼镜一起使用。
编辑。好吧,也许您可以设计一些具有 "read only" 光学器件的东西 - 即总是无法更新的 Prism,但我认为这将是对这个想法的可怕憎恶。那么你就不会在 Person 上工作,而是在 Person 的一些副产品上工作,但这会很尴尬地违反直觉,所以我什至没有开始考虑如何实现它。
我有一个案例 class 比如:
case class Person(name, birthDate, many other fields) { def something = //根据字段计算 }
最后我真正想要的是拥有用于名称、出生日期的镜头和用于某物的只读镜头,并且如果可能的话将它们组合在一起以获得用于设置 name/birthDate 和读取 name/birthDate/东西
据我有限的知识,这似乎是不可能的(在 shapeless 中,我在为 something 函数创建镜头时遇到错误)
也许在其他镜头库中是可能的,或者我需要做一个重构
考虑到光学通常解决 two-way 访问问题(getting/settings 如果可能的话),没有 只读镜头 .
因此,无论您使用 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
关于一般的光学,有一篇很好的文章介绍了它们以及如何将它们与单片眼镜一起使用。
编辑。好吧,也许您可以设计一些具有 "read only" 光学器件的东西 - 即总是无法更新的 Prism,但我认为这将是对这个想法的可怕憎恶。那么你就不会在 Person 上工作,而是在 Person 的一些副产品上工作,但这会很尴尬地违反直觉,所以我什至没有开始考虑如何实现它。