什么是商店在scalaz
我试图理解
scalaz中的镜头(令人惊讶的是在cat-core中找不到类似的东西)我遇到了所谓的Store,它是一个类型别名:
type StoreT[F[_],A,B] = IndexedStoreT[F,B] type IndexedStore[I,B] = IndexedStoreT[Id,I,B] type Store[A,B] = StoreT[Id,B] 哪里 final case class IndexedStoreT[F[_],+I,B](run: (F[A => B],I)) 问题是如何对待这种类型?文档只是引用了镜头.用几句话就可以解释一下吗? 对我来说,它看起来类似于State monad,其中“状态转换”以函数F存储[A => B] 解决方法
存储[S,A]是一个充满As的结构,由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色位图.您可以查看光标下像素的颜色(由字节表示),并且可以使用搜索将光标移动到不同的像素. 商店comonad 商店[S,_]也是一个comonad.这意味着它支持以下操作: map : (A => B) => (Store[S,A] => Store[S,B]) extend : (Store[S,A] => B) => (Store[S,B]) duplicate : Store[S,Store[S,A]] map表示您可以使用函数更改商店中的所有值. s.extend(f)采用“本地”计算f,其在S的特定位置处的商店上操作,并将其扩展到在每个位置处在商店上操作的“全局”计算.在位图示例中,如果您有一个函数mean(store)来获取商店中光标周围的像素的平均值,那么store.extend(mean)将对整个图像执行高斯滤镜.新图像中的每个像素将是紧邻原始图像中该位置处的像素的像素的平均值. s.duplicate为你提供了一个Store [S,Store [S,A]],它充满了Store [S,它在每个位置S都有一个原始Store [S,A]的副本,其光标设置为位置S. 与国家的关系 商店是国家的双重身份.在引擎盖下,状态[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).如果你以一种方式组成它们,你会得到状态[S,_].如果你以另一种方式组成它们,你会得到Store [S,_]. 我几次谈了这个: https://www.youtube.com/watch?v=FuOZjYVb7g0 你可以利用这种二元性的一种很酷的方式是,如果你有一个商店和一个状态机,它们就会相互消灭.商店驱动状态机,然后状态机从商店中选择一个值. def zap[S,B](state: State[S,store: Store[S,B]): (A,B) = { val (a,s) = state.run(store.pos) (a,store.seek(s).peek) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |