Haskell:在Getter中使用或使用

Haskell: use or uses in Getter

在Control.Lens中我们有Getter可以访问嵌套结构。 Getter 有用又用,但我不清楚它们是如何工作的。因此,如果有人可以提供一些使用或使用的简单示例,那就太好了。

为什么我需要知道它?因为我正在阅读 Haskell 中的一些 implementation,其中使用了 "uses" 和 "use"。特别是它说:

inRange <- uses fsCurrentCoinRangeUpperBound (coinIndex <=)

如果上面的代码只是为了比较 (<=) 两个值,那我们为什么还需要 "uses" 呢?

正如我在 上对你的其他问题的回答中试图阐明的那样,在你理解这一点之前需要很多必要的知识。

首先,你必须对 Lens 有相当的了解。从您的其他问题来看,您才刚刚开始。这很棒!他们非常酷,解决这些问题非常棒。

但是,在这里我要特别提醒您,Haskell 的危险之一是它如此 强大,并且可以 如此 表达力和简洁性,似乎很容易尝试跳过内容。

例如,如果您很好地跳过了对代数数据类型的理解,您可以轻松阅读代码,并且 认为您完全不理解它。这可能会导致复杂的混乱,你会觉得你不明白其中的任何一个,这实际上可能是真的,但这种感觉在学习 Haskell.[=23 时并不是一种好的感觉。 =]

我不想让你有那样的感觉。

所以我鼓励你学习 Lens,但如果你不具备 Lens 的必要知识,那么我鼓励你先去学习它。在一定程度上理解这些东西并不 困难,但是 Lens 的编写方式对于那些至少不熟悉简单类型、参数化类型、代数数据类型、类型类、Functor 类型类,要真正理解它,您需要了解 Functor 的几个实例。

此外,如果您试图理解 useuses,它们仅在处理 State 值时才有意义,那么我认为这几乎是不可能的在不知道 State 是什么 以及 Lens 做什么和是什么的情况下了解正在发生的事情。

useuses 用于获取镜头和状态值,并查看 State 值内的当前状态。因此,在某种程度上,您确实还需要了解 do 语法在做什么,因此在一定程度上了解 Monad 类型类,以及 State / MonadState 是如何工作的从这个角度来看。

如果跳过任何这些预备知识,您会感到困惑。

希望对您有所帮助!祝你一切顺利。