函数的只读镜头

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 的一些副产品上工作,但这会很尴尬地违反直觉,所以我什至没有开始考虑如何实现它。