Rum*_*mca 3 haskell category-theory category-abstractions
我想我差不多想出了Class类代表什么.然而,在这个抽象层次,它让我想知道我在哪里可以找到它的通用用途.
使用.或id来自哪些代码Control.Category已找到不同实例的实际用途?
最近常见的是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 的包中找到.
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |