编写一个函数来保留记录成员

时间:2015-12-30 16:33:28

标签: haskell

我有一条记录,比如$('#checkusername').keyup(function() { var username = $('#checkusername').val(); $.ajax({ url: 'usernamecheck-validate.php', type: 'POST', data: { checkusername: username }, success: function(data){ $('.status').html(data); } }); }); ,以及一个以某种方式转换该记录的mutator函数(例如,通过改变一个成员):

structure

a_mutator :: structure -> structure 可能是我程序的默认配置.mutator可以是根据命令行选项更改默认配置的函数。

(我们也可以写一个别名:

structure

现在,我不想让mutator改变结构的某些成员。例如,可能不允许用户更改配置中的工作模式。

我将强制执行的方法是首先保存这些成员,应用mutator,然后放回保留的成员:

 type Mutator structure = structure -> structure

其中preserving :: Lens' structure member -> (structure -> structure) -> (structure -> structure ) preserving le mutator = \ target -> let previous_value = target ^. le mutated = mutator target in set le previous_value mutated (^.)来自lens库。

现在,因为set的类型可以重写为

preserving

组成preserving :: Lens' structure member -> Mutator structure -> Mutator structure 函数的部分应用程序是合理的:

preserving

意图保留lens1指向的成员和lens2指向的成员。问题是,这有效吗?也就是说,preserving lens1 . preserving lens2 应用程序"撰写"这条路?如果是这样,我怎样才能建立某种证明呢?如果他们没有撰写,我该如何解决?

1 个答案:

答案 0 :(得分:1)

在我看来,这不是使用镜头库达到目的的最佳方式。如果在不更新mutateMemberWith :: (forall structure . Structure -- Input -> structure -- Copy of input -> Lens' structure Member -> structure) -> Structure -> Structure mutateMemberWith f s = f s s appropriateLens 调用的情况下向结构添加新的“敏感”字段,则可能效率低下并且可能打开“安全漏洞”。而不是枚举mutator必须保留的东西,你应该枚举它可能更改的东西。所以

create unique index unq_rx_r_hash on rx(r_hash);

传入的函数不允许关心它产生的类型,所以它只能通过使用给定镜头修改输入来产生它。