在哪种情况下使用Haskell类别组合?

Rum*_*mca 3 haskell category-theory category-abstractions

我想我差不多想出了Class类代表什么.然而,在这个抽象层次,它让我想知道我在哪里可以找到它的通用用途.

使用.id来自哪些代码Control.Category已找到不同实例的实际用途?

J. *_*son 6

最近常见的是Mealy机器.考虑一个无限的流

data Stream a = Stream a (Stream a)
Run Code Online (Sandbox Code Playgroud)

现在我们可以写出可以消耗的无限流,比如 [1..]

oneUpTo :: Stream Int
oneUpTo = go 1 where go n = Stream n (go (n+1))
Run Code Online (Sandbox Code Playgroud)

但有时候编写可能受输入影响的流也很有用.为此,我们将隐藏函数后面的流的下一个"步骤"

data Mealy b a = Mealy (b -> (a, Mealy b a))
Run Code Online (Sandbox Code Playgroud)

现在我们可以写一些更奇特的回答,比如 echo

echo :: a -> Mealy (Maybe a) a
echo a = Mealy go where
  go Nothing   = (a,  echo a )
  go (Just a') = (a', echo a')
Run Code Online (Sandbox Code Playgroud)

它允许输入switch流的内部"状态".当然,这是现在更强大的东西.我称之为Mealy机器,因为它形成了某种(in-)有限状态自动机.

然而,有点不明显的是Mealy形成一个Category.

instance Category Mealy where
  id = Mealy (\a -> (a, id))
  Mealy bc . Mealy ab = Mealy $ \a -> case ab a of
    (b, nab) -> case bc b of
      (c, nbc) -> (c, nbc . nab)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们Mealy通过构建第三台机器来组合两台机器,第三台机器将其输入馈送到第一台机器,将第一台机器的输出带到第二台机器,然后返回最终输出以及更新的组合对.

如果这很有趣并且您不介意使用相当稀疏的文档来探索大型包,那么它就可以在machinesHackage 的包中找到.

  • 这是一个非常重要的类别的一个很好的例子(我认为_profunctor_在这里是更具描述性的名称),但它并没有完全解决OP的问题,即`_`和`id`的_generic_使用. (3认同)