何处使用Haskell类别组合而不考虑实例?

何处使用Haskell类别组合而不考虑实例?,haskell,category-theory,category-abstractions,Haskell,Category Theory,Category Abstractions,我想我几乎弄明白了Category类代表什么。然而,在这个抽象层次上,它让我想知道在哪里可以找到它的通用用法 使用或控件中的id的代码。类别已在不同实例中找到实际用途?最近一种常见的是Mealy机器。考虑无限流 data Stream a = Stream a (Stream a) 现在,我们可以编写无限的可消费流,如[1..] oneUpTo :: Stream Int oneUpTo = go 1 where go n = Stream n (go (n+1)) 但有时编写也会受到输入影

我想我几乎弄明白了Category类代表什么。然而,在这个抽象层次上,它让我想知道在哪里可以找到它的通用用法


使用
控件中的
id
的代码。类别
已在不同实例中找到实际用途?

最近一种常见的是Mealy机器。考虑无限流

data Stream a = Stream a (Stream a)
现在,我们可以编写无限的可消费流,如
[1..]

oneUpTo :: Stream Int
oneUpTo = go 1 where go n = Stream n (go (n+1))
但有时编写也会受到输入影响的流是有用的。为此,我们将在函数后面隐藏流的下一个“步骤”

data Mealy b a = Mealy (b -> (a, Mealy b a))
现在我们可以写一些更奇特的响应,比如
echo

echo :: a -> Mealy (Maybe a) a
echo a = Mealy go where
  go Nothing   = (a,  echo a )
  go (Just a') = (a', echo a')
它允许输入
开关
流的内部“状态”。当然,这是更强大的东西了。我称之为“米里机器”,因为它形成了某种(内)有限状态自动机

然而,有一点不明显的是,
Mealy
形成了一个
类别

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)
在这种情况下,我们通过构建第三台机器来组合两台
Mealy
机器,第三台机器将其输入输入输入第一台机器,将第一台机器的输出输入第二台机器,然后返回最终输出以及更新的组合对


如果这很有趣,并且您不介意探索一个包含相当稀疏文档的大型软件包,那么它都可以在Hackage软件包中找到。

尤其是每个
箭头都是一个类别。野外有很多有趣的
Arrow
s。我从这里开始。您可能还对示例类别和用法感兴趣。这是一个非常好的非平凡类别示例(我认为profunctor是这里更具描述性的名称),但它并没有确切地回答OP关于
id
的一般用法的问题。