镜头不仅仅是具有该类型的函数forall f. Functor f => (a -> f b) -> s -> f t
- 它是具有该类型的函数,该函数遵循某些定律。特别是(如镜头文档中所述):
如果您的函数不遵守这些定律,那么它只是一个类型类似于镜头的函数。
在您的特定示例中,listLength
违反了第一定律和第三定律,因此它不是镜头。也就是说,它作为Getter
.
更一般地说,询问缺乏规律的事物并没有什么意义,因为事物往往由它们遵守的法律而不是它们不遵守的法律来定义。例如,我指出这listLength
使得 a 非常好,Getter
因为它始终如一地从[a]
输入中提取一个值。
那么,我会问你:它与listZero :: Lens [a] Int
总是发出的函数有什么区别0
?你能想出一个不listLength
遵守的一般规律listZero
吗?如果是这样,那么您实际上可以在当前文献中寻找一些东西:也就是说,它listLength
是遵守某些(可能有趣的)定律的一组函数之一。如果不是,那么您只有一个类型使其看起来像镜头的函数。