小编aft*_*mmy的帖子

mapA如何在Haskell中使用Stream Function Arrow?

背景

我一直在阅读约翰·休斯的" 箭头编程",我觉得直到下面的使用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)

我希望这会产生的"电路"是:

mapA的控制流程图(延迟0)

数字标记过程的一部分:

  1. 对于任何非空list x,listcase都会发出Right(x, xs).对于空列表,listcase将发出Left(),终端案例.
  2. 标记的值Right将传递到下半部分.标记的值 …

haskell arrows

10
推荐指数
1
解决办法
321
查看次数

标签 统计

arrows ×1

haskell ×1