list - 从理论上讲,这是列表的有效comonad 实例吗?

标签 list haskell comonad

我试图掌握共子的概念,在阅读 this blog post 之后,我想我对它们的作用以及它们与单子(monad)的关系有了深刻的理解。但是,我想我会深入研究一下这个主题,然后想想通用列表类型(你知道, [a] )的comonad实例会是什么样子,我已经找到了一个我不完全知道的东西是正确的。

因此,鉴于博客文章使用的实例:

class Functor w => Comonad w where
    (=>>)    :: w a -> (w a -> b) -> w b
    coreturn :: w a -> a
    cojoin     :: w a -> w (w a)

我认为 [a] 的实例声明看起来像这样([a] 的语法可能是不可能的或错误的,但你明白了这里的想法):
instance Comonad [a] where
    coreturn = head
    cojoin = Data.List.subsequences --this is what I'm confused about
    x =>> f = map f (cojoin x)

在这里,我们只是找到了列表中的所有 subsequences,但完全可以使用它的 powerset 之类的。在 (a -> [a]) 形式的列表中有几个函数,对于哪个是正确的有点模棱两可。

这是否意味着 [a] 不能正确地实例化为共单子(monad),或者只是由用户决定 cojoin 实际会做什么?

最佳答案

如评论中所述,您不能为自 coreturn 以来可能为空的列表创建一个comonad 实例。必须返回一些东西。

除此之外,您的实例还必须满足comonad 定律。用 coreturn 表示和 cojoin , 这些是:

  • coreturn . cojoin = id
  • fmap coreturn . cojoin = id
  • cojoin . cojoin = fmap cojoin . cojoin

  • 即使我们不允许空列表,您也可以轻松地看到这些不适用于您的实例。但是,假设 coreturnhead ,我们可以利用这些规律来获得一些关于什么的线索cojoin一定是。

    从 (1) 中,我们可以确定 cojoin 返回的列表的第一个元素必须是原始列表,从 (2) 中我们看到,组合每个内部列表的第一个元素也必须产生原始列表。这强烈表明我们需要像 tails 这样的东西。 *,并且可以确认这也满足(3)。

    * 更具体地说,我们需要 tails 的版本不包括最后的空列表。

    关于list - 从理论上讲,这是列表的有效comonad 实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12537149/

    相关文章:

    python - 重新格式化日期字段

    haskell - 使用 Hspec 测试用户输入

    haskell - 树仿函数和可折叠但带有节点。对此有什么概括吗?

    haskell - underscore.js 中的 chain 函数是否创建了一个 monad?

    java - 当数组足够时使用 Java List

    Python:从列表对象中删除空格

    c++ - 从另一个成员函数/构造函数调用 C++ 构造函数是否执行初始化列表?

    haskell - 二次筛和n次方

    sockets - 如何在 Haskell 中从套接字发送和接收消息

    haskell - 你能根据 `Comonads` 定义 `Monads` 吗?