gpt4 book ai didi

scala - scalaz中的商店是什么

转载 作者:行者123 更新时间:2023-12-04 14:08:42 25 4
gpt4 key购买 nike

我试图理解Lens中的scalaz es(令人惊讶的是,在cats-core中找不到类似的东西),并且遇到了所谓的Store,它是类型别名:

type StoreT[F[_], A, B] = IndexedStoreT[F, A, A, B]
type IndexedStore[I, A, B] = IndexedStoreT[Id, I, A, B]
type Store[A, B] = StoreT[Id, A, B]

在哪里
final case class IndexedStoreT[F[_], +I, A, B](run: (F[A => B], I))

问题是如何治疗这种类型?该文档仅引用 Lens es。有人可以用几个词解释一下吗?

对我来说,它看起来类似于 State monad,其中“状态转换”使用 F[A => B]函数存储

最佳答案

Store[S,A]是一个充满A的结构,该结构由S索引,其中一个独特的S作为该结构中的“游标”。

要回答“这是什么?”这个问题,看看它支持什么操作是最有启发性的。

您可以要求光标的位置:

_.pos : Store[S,A] => S

您可以“浏览”光标下方的值:
_.peek : Store[S,A] => A

您可以“搜索”移动光标:
_ seek _ : (Store[S,A], S) => Store[S,A]

可以将其视为维度 S的数组,在数组中有一个索引 s:S,然后可以移动索引。

例如, Store[(Int,Int), Byte]是二维256色位图。您可以将 peek设置为光标下方像素的颜色(以字节表示),然后可以使用 seek将光标移至其他像素。

商店comonad
Store[S,_]也是comonad。这意味着它支持以下操作:
map : (A => B) => (Store[S,A] => Store[S,B])
extend : (Store[S,A] => B) => (Store[S,A] => Store[S,B])
duplicate : Store[S,A] => Store[S, Store[S, A]]
map意味着您可以使用函数来更改存储中的所有值。
s.extend(f)接受“本地”计算 f,该运算在 S的特定位置在商店上进行操作,并将其扩展为在每个位置的商店上进行操作的“全局”计算。在位图示例中,如果您具有函数 mean(store),该函数采用 store中紧接光标周围的像素的平均值,那么 store.extend(mean)将对整个图像执行高斯滤波。新图像中的每个像素将是原始图像中该位置紧邻像素周围像素的平均值。
s.duplicate为您提供了一个完整的 Store[S,Store[S,A]]Store[S,A],在每个位置 S都有原始 Store[S,A]的副本,其光标设置为该位置 S

与国家的关系
StoreState的对偶。在幕后, State[S,A]实际上是 S => (A, S)Store[S,A]实际上是 (S => A, S):
State[S,A] ~= S => (A, S)
Store[S,A] ~= (S => A, S)

两者都由两个仿函数 S => _(_, S)组成。如果以一种方式编写它们,则会得到 State[S,_]。如果以其他方式编写它们,则会得到 Store[S,_]

我几次谈到了这一点:

https://www.youtube.com/watch?v=FuOZjYVb7g0

可以利用这种双重性的一种很酷的方法是,如果您拥有商店和状态机,它们将相互消灭。存储驱动状态机,然后状态机从存储中选择一个值。
def zap[S,A,B](state: State[S,A], store: Store[S,B]): (A,B) = {
val (a, s) = state.run(store.pos)
(a, store.seek(s).peek)
}

关于scala - scalaz中的商店是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50888056/

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