我一直在阅读约翰·休斯的" 箭头编程",我觉得直到下面的使用mapA的例子我才能直截了当:
>runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
[[0,0,0],[1,2,3],[4,5,6]]
Run Code Online (Sandbox Code Playgroud)
其中runSF从StreamFunction箭头中提取流函数,定义为:
newtype SF a b = SF {runSF :: [a]->[b]}
Run Code Online (Sandbox Code Playgroud)
延迟定义为:
delay x = SF (init . (x:))
Run Code Online (Sandbox Code Playgroud)
SF是ArrowChoice的一个实例(声明mapA),因此是Arrow的一个实例.
mapA :: arr a b -> arr [a] [b]
delay :: SF a b
Run Code Online (Sandbox Code Playgroud)
这样delay只需要用它的第一个参数预先设定它的第二个参数.
因此,mapA (delay 0)应该返回一个获取[[a]]并返回的SF箭头[[b]]
mapA (delay 0) :: SF [[a]] [[b]]
Run Code Online (Sandbox Code Playgroud)
我希望这会产生的"电路"是:

数字标记过程的一部分:
list x,listcase都会发出Right(x, xs).对于空列表,listcase将发出Left(),终端案例.Right将传递到下半部分.标记的值 …