【发布时间】:2017-07-03 12:23:59
【问题描述】:
我看过各种版本的镜头法则。不确定它们是否都是等效的,所以为了明确起见,我将使用 StackOverflow 上的版本来对抗标签 Lenses [Edward Kmett ~ 5 年前]
(我问是因为我想要更多地处理双向编程。)
使用a作为结构,b作为结构中的组件/值:
get (set b a) = b
好的。你得到的就是你付出的。对于任何自称为数据结构/容器的东西来说似乎都是必不可少的。我可能有一个小问题:最初的a 来自哪里?我可以直接去get a吗?这意味着什么?
get (set b' (set b a)) = b'
?我相信这是为了告诉我:你得到的是你最后放的东西(而你之前放的任何东西都永远丢失了)。但实际上并没有这么说。它不(例如)排除镜头是堆栈内-a - 即get 的行为类似于pop。所以如果我再做一次get,它可能会返回之前的b。 IOW 它需要说:一旦你已经set b' (whatever-a),get 将永远返回b' ad infinitum。
This is law 有时写成以下形式:set b' (set b a) = set b' a。但我根本不喜欢这样,这让我想到:
set (get a) a = a
把你已经拥有的东西放在一边没有任何作用。 (这似乎是一件几乎没有意思的事情:它不是遵循第 1 条吗?)但是对结构的相等性测试正在打破抽象。我们(作为结构的客户)并不关心结构在内部是如何组织的。我们的接口是根据方法get、set。放置您已经拥有的东西可能会改变我们所关心的结构的价值——只要 get 返回我们放置的值。
如果set (get a) a 的值/内容有什么重要的,那不能用get/set 来表达吗?如果不能,我们为什么要关心?
所有这些定律都是用一个镜头来描述的。因此,如果结构只是一个“插槽”,他们会坚持下去——这似乎是很多机器,也就是“变量”。
似乎缺少的是如何组合不同的镜头来处理更复杂的结构。这样的结构允许每个镜头正交工作。我相信有范拉霍文定律:
-- I need two lenses, so I'll use get', set' as well as get, set
get' (set b (set' b' a)) = b'
我不需要这样的法律吗?请解释一下。
【问题讨论】:
标签: functional-programming lenses