我想我几乎弄清楚了 Category 类代表什么。然而,在这个抽象级别上,我想知道在哪里可以找到它的通用用途。
哪些代码 using.
或id
fromControl.Category
发现了不同实例的实际用途?
我想我几乎弄清楚了 Category 类代表什么。然而,在这个抽象级别上,我想知道在哪里可以找到它的通用用途。
哪些代码 using.
或id
fromControl.Category
发现了不同实例的实际用途?
最近常见的一种是 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')
它允许输入switch
流的内部“状态”。当然,这是现在更强大的东西。我称它为 Mealy 机器,因为它形成了某种(无限)有限状态自动机。
然而,有点不明显的是,它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)
在这种情况下,我们Mealy
通过构建第三台机器来组合两台机器,第三台机器将其输入馈送到第一台机器,将第一台机器的输出带到第二台机器,然后返回最终输出以及更新的组合对。
如果这很有趣,并且您不介意探索具有相当稀疏文档的大型软件包,那么这些都可以在machines
Hackage 的软件包中找到。