gpt4 book ai didi

haskell - 镜头 : Composing backwards and (. ) 在镜头上下文中

转载 作者:行者123 更新时间:2023-12-03 13:02:02 29 4
gpt4 key购买 nike

我一直在阅读this article并且在他们的一节中指出:

Lenses compose backwards. Can't we make (.) behave like functions?

You're right, we could. We don't for various reasons, but the intuition is right. Lenses should combine just like functions. One thing that's important about that is id can either pre- or post- compose with any lens without affecting it.



镜头向后组合是什么意思?

另外,这是什么意思:我们不能制作 (.)表现得像函数?
(.)是一个函数,通过将它与 Lens 一起使用是否可以使 (.)表现得像别的东西?

最佳答案

Lens 类型:

type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t

出于我们的说明目的,我们可以坚持使用不太通用的简单镜头类型, Lens' .然后右侧变成:
forall f. Functor f => (a -> f a) -> s -> f s

直觉上, (a -> f a)是对 s 类型结构的一部分的操作,提升为对整个结构的操作, (s -> f s) . (仿函数类型构造函数 f 是诡计的一部分,它允许镜头泛化 getter、setter 和许多其他东西。我们现在不需要担心它。)换句话说:
  • 从用户的角度来看,镜头允许在给定整体的情况下聚焦其中的一部分。
  • 在实现方面,镜头是一种函数,它采用局部函数并产生整体函数。

  • (请注意,在我刚刚所做的描述中,“部分”和“整体”以不同的顺序出现。)

    现在,一个镜头就是一个功能,功能是可以组合的。众所周知, (.)有类型:
    (.) :: (y -> z) -> (x -> y) -> (x -> z)

    让我们将涉及的类型制作成简单的镜头(为了清楚起见,我将删除约束和 forall )。 x变成 a -> f a , y变成 s -> f sz变成 t -> f t . (.)专业型那么将是:
    ((s -> f s) -> t -> f t) -> ((a -> f a) -> s -> f s) -> ((a -> f a) -> t -> f t)

    我们得到的镜头类型为 (a -> f a) -> (t -> f t) .所以,一个组合镜头 firstLens . secondLenssecondLens 聚焦的部分进行操作并对整个结构进行操作 firstLens针对。这恰好与组合 OO 样式字段引用的顺序相匹配,这与普通 Haskell 记录访问器的组合顺序相反。

    关于haskell - 镜头 : Composing backwards and (. ) 在镜头上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23092468/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com