繁体   English   中英

非法镜头 Haskell

[英]unlawful lens Haskell

对于不满足取出您放入的内容的属性的类似镜头的 object 是否有通用名称/类型? 例如像listLength:: Lens [a] Int这样的东西,如果你输入一个比源列表更短的长度,你会得到一个缩短的列表,但如果你输入更长的长度,则保留原始长度。

镜头不只是型号为forall f. Functor f => (a -> fb) -> s -> ft forall f. Functor f => (a -> fb) -> s -> ft — 它是一个 function ,其类型符合某些法律 特别是(如镜头文档中所述):

  1. 你拿回你投入的东西,
  2. 把你得到的东西放回去并不会改变任何东西,并且
  3. 设置两次与设置一次相同。

如果您的 function 不遵守这些法律,那么它只是一个类似于镜头类型的 function。

在您的特定示例中, listLength违反了第一和第三定律,因此它不是镜头。 也就是说,它可以作为Getter正常工作,我认为这是我们可以说的唯一原则。


更一般地说,询问缺乏法律的事物是没有意义的,因为事物往往是由它们遵守的法律而不是他们不遵守的法律来定义的。 例如,我指出listLength是一个非常好的Getter ,因为它始终从[a]输入中提取一个值。

所以,我会问你:它与总是发出0的 function listZero:: Lens [a] Int有什么区别? 你能想出一个listLength遵守listZero不遵守的一般规律吗? 如果是这样,那么您可以在当前的文献中实际寻找一些东西:也就是说, listLength是一组遵循某些(可能有趣的)定律的函数之一。 如果没有,那么您只有一个 function,其类型使其看起来像镜头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM