非法镜头哈斯克尔

Ace*_*ami 1 haskell lenses

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

DDu*_*Dub 7

镜头不仅仅是具有该类型的函数forall f. Functor f => (a -> f b) -> s -> f t - 它是具有该类型的函数,该函数遵循某些定律。特别是(如镜头文档中所述):

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

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

在您的特定示例中,listLength违反了第一定律和第三定律,因此它不是镜头。也就是说,它作为Getter.


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

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

  • `listLength` 遵守标准的往返半定律,而 `listZero` 可能不遵守,具体取决于它对“put”方向的实现。所讨论的定律是这样的:如果 `put vx = v'`,则 `put v' (get v') = v'`。在一些较古老的文献中,遵守两个往返半定律就足以将一个物体称为镜头。表现良好的镜头也遵循您的(1)和(2);现在“镜头”包中提供的那些遵守所有三个定律的镜头被称为性能良好的镜头。 (2认同)