我喜欢想Arrow
s 作为可组合的有向无环图。例如,类型的箭头:
SomeArrow (a, b, c) (d, e, f)
...您可以将其视为具有三个类型的传入边的图a
, b
, and c
和类型的三个传出边缘d
, e
, and f
.
使用这种解释,类别组合操作为Arrow
s 就像图的水平串联,将它们的边连接在一起:
(.) :: SomeArrow b c -> SomeArrow a b -> Some Arrow a c
... 在哪里a
, b
, and c
可能本身就是元组。相似地,id
只是将所有传入边转发到传出边的恒等图:
id :: SomeArrow a a
另一个关键操作是(***)
这就像图的垂直串联:
(***) :: Arrow a b -> Arrow c d -> Arrow (a, c) (b, d)
您可以将其视为并排放置两个图,组合它们的输入边和输出边。
So Arrow
在处理类型化有向无环图时通常会出现这种情况。然而,您通常看不到它们的原因是大多数人在心理上将图与非类型化和高性能数据结构联系起来。