Tag: comonad

什么是商店comonad?

对Haskell中的Comonadtypestypes有一些了解,我已经听说了Store的comonad。 但看着Control.Comonad.Store.Lazy ,我真的不明白。 这是什么意思? 这是为了什么? 我听说Store = CoState是Monad的双重身份。 那是什么意思?

为n维网格types编写联合或cobind

使用types级自然的典型定义,我定义了一个n维网格。 {-# LANGUAGE KindSignatures #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE TypeFamilies #-} data Nat = Z | S Nat data U (n :: Nat) x where Point :: x -> UZ x Dimension :: [U nx] -> U nx -> [U nx] -> U (S n) x dmap :: (U […]

了解为什么Zipper是一个Comonad

这是对我以前的问题的回答。 假设我需要将函数def f(a:A, leftNeighbors:List[A]): B并且生成List[B]每个项目a:A List[A]映射到b:B . 显然,我不能只是在列表中调用map ,但我可以使用列表拉链 。 拉链是一个在列表中移动的游标。 它提供对当前元素( focus )及其邻居的访问。 现在我可以用def f'(z:Zipper[A]):B = f(z.focus, z.left)来代替我的f ,并将这个新函数f'传递给Zipper[A] cobind方法。 cobind工作原理是这样的:它用拉链调用f' ,然后移动拉链,用新的 “移动”拉链调用f' ,再次移动拉链等,依此类推…直到拉链到达名单末尾。 最后, cobind返回一个types为Zipper[B]的新拉链Zipper[B] ,它可以转换成列表,这样问题就解决了。 现在注意cobind[A](f:Zipper[A] => B):Zipper[B]和bind[A](f:A => List[B]):List[B]之间的对称性bind[A](f:A => List[B]):List[B] Monad和Zipper是Comonad 。 是否有意义 ?

如何从monadic行动中提取价值

是否有一个内置函数签名:: (Monad m) => ma -> a ? 霍格尔说,没有这样的function。 你能解释一下为什么?

拉链Comonads,一般

鉴于任何容器types,我们可以形成(以元素为中心的)拉链,并知道这个结构是一个Comonad。 这是最近探讨在另一个堆栈溢出问题的以下types的精彩细节: data Bin a = Branch (Bin a) a (Bin a) | Leaf a deriving Functor 用下面的拉链 data Dir = L | R data Step a = Step a Dir (Bin a) deriving Functor data Zip a = Zip [Step a] (Bin a) deriving Functor instance Comonad Zip where … Zip是一个Comonad虽然它的实例有点多毛。 也就是说, Zip可以从Tree完全机械地派生出来,并且(我相信)以这种方式派生的任何types都自动成为Comonad ,所以我觉得应该是这样的,我们可以一般地自动构造这些types和它们的连接器。 […]