- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在浏览约翰休斯的Programming with Arrows ,我觉得我脑子里一切都很清楚,直到下面使用 mapA 的例子:
>runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
[[0,0,0],[1,2,3],[4,5,6]]
其中 runSF 从 StreamFunction 箭头中提取流函数,定义为:
newtype SF a b = SF {runSF :: [a]->[b]}
延迟定义为:
delay x = SF (init . (x:))
SF 是 ArrowChoice 的一个实例(它声明了 mapA),因此也是 Arrow 的一个实例。
mapA :: arr a b -> arr [a] [b]
delay :: SF a b
这样delay
只需在其第二个参数前面加上第一个参数即可。
因此,mapA (delay 0)
应该返回一个SF箭头,它接受[[a]]
并返回[[b]]
mapA (delay 0) :: SF [[a]] [[b]]
我希望这会导致的“电路”是:
其中数字标记流程的各个部分:
list x
,listcase
将发出 Right(x, xs)
。对于空列表,listcase
将发出 Left()
,即终端情况。Right
的值将传递到下部。标记为 Left
的值将传递给 const[]
,这实际上会停止迭代。(x, xs)
时,x
将传递给 (delay 0)
,而 xs
> 将被传回 listcase
。(z, zs)
,它会传递给 uncurry (:)
,后者将元组重新连接到列表中。这是我对流程的理解,输入[[1,2,3],[4,5,6],[7,8,9]]
:
第一遍
右 ([1,2,3],[[4,5,6],[7,8,9]])
([1,2,3], [[4,5,6],[7,8,9]])
传递到下部[1,2,3]
上调用
(delay 0)
,生成 [0,1,2]
。 [[4,5,6],[7,8,9]]
被传回 listcase
第二遍
右([4,5,6], [[7,8,9]])
([4,5,6], [[7,8,9]])
传递到下部(delay 0)
在 [4,5,6]
上调用,结果为 [0,4,5]
。 [[7,8,9]]
被传回 listcase
第三遍
右([7,8,9], [])
([7,8,9], [])
被传递到下部[7,8,9]
上调用
(delay 0)
,生成 [0,7,8]
。 []
被传回 listcase
。第四遍
向左 ()
,掉在地板上。此时,我们进入第 4 部分,它获取 3 的输出并将其连接在一起。我们本质上构建了以下操作:
[0,1,2] : [[0,4,5] : [[0,7,8] : []]]
这将为我们提供[[0,1,2],[0,4,5],[0,7,8]]
。
显然,我的上述流程是错误的。
调用 runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
会产生什么结果 [[0,0,0],[1,2,3],[4,5,6]]
?
最佳答案
我发现这些例子很难推理。这里面有两个列表例如,外部列表是您的箭头操作的流,而内部列表是mapA 映射的内容。考虑一个更简单的例子,所以我们现在可以忽略递归情况。鉴于
runSF (mapA (delay 0)) [[1], [2]]
我们看到第一步
listcase
箭头输送输入即可得到输出[右(1,[]),右(2,[])]
。每对的第一个元素被馈送到delay 0
箭头,而第二个元素被馈送到返回mapA f
。[1, 2] => 延迟 0
和 [[], []] => mapA f
。将 [1,2]
送入 delay 0
给出结果 [0, 1]
,并且将空列表输入 mapA f
会产生更多空列表[[], []]
.这两个结果被输入到 arr (uncurry (:))
,其作用类似于 zipWith (:)
,由于这些函数都映射到列表上,因此它连接了两个输入按元素列出。
[0, 1]
|
v
arr (uncurry (:)) => [ 0:[], 1:[] ] == [[0], [1]]
^
|
[[], []]
关键是要认识到所有用 arr
构造的东西都可以在内部列表集,因此通过 arr listcase 运行初始输入不会产生 Right ([1,2,3],[[4,5,6],[7,8,9]])
,但是[右(1, [2, 3]),右(4, [5,6]),右(7, [8,9])]
。这是我尝试将其绘制在图表中。
[Right (1, [2, 3]), Right (4, [5,6]), Right (7, [8,9])]
=======================================================
| [1, 4, 7] +-----------+ [0, 1, 4]
+----------+ | +----=--------->| delay |-----=------|
| listcase |---=------>| +-----------+ | +-------------------+
+----------+ | +-->| arr (uncurry (:)) |---> [[0,0,0],[1,2,3],[4,5,6]]
| | +-------------------+
| +-----------+ |
+-------=------>| mapA f |------=-----|
| +-----------+ |
| |
[[2,3],[4,5],[6,7]] [[0,0], [2,3],[4,5]]
* what will be
returned if you
trace it through
抱歉,我无法画得更好。实际上,mapA
给出了转置 View 输入列表的,因此您可以将 mapA (delay 0)
视为如下操作转置 . map (初始化。(0:))。转置
,因为 init 。 (0:)
是延迟的定义
。
关于haskell - mapA 如何与 Haskell 中的流函数 Arrow 配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048100/
自定义限流注解 先介绍一下 @Retention 和 @Target 这两个元注解 @Retention: 指定注解的生命周期(源码、class文件、运行时),其参考值见类的定义:java.lang.
在 Ubuntu 13.10 中使用 PyCharm Community Edition 和 IdeaVim 时,键盘经常停止接受输入,我必须重新启动 IDE。当我单击不同的文本区域时,光标仍然会移动
我正在开发一个Java项目,我试图让useDelimiter删除除“=”和“,”之间的文本之外的所有内容。例如,在文件的第一行我想保留“ThermostatNight”。 文本文件如下所示: E
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
目录 1、加入 remember-me 2、原理分析 自动登录是我们在软件开发时一个非常常见的功能,例如我们登录 QQ 邮箱: 很多网站我们在登录的时
我是开发 Android 应用程序的菜鸟。我想问一下。我的 PreferenceActivity 如何希望在不返回 MainActivity 并再次转到 PreferenceActivity 的情况下
1. 前言 大家好,我是安果! 我们都知道 Python 可以用来开发桌面应用,一旦功能开发完成,最后打包的可执行文件体积大,并且使用 Python 开发桌面应用周期相对较长 假如想快速开
我正在为命令行应用程序编写一个非常简单的 GUI 工具。它只有 2 个按钮。 连接并退出。 在 applicationDidFinishLaunching 中,我运行以下命令 NSPipe *pipe
我也在 LibGDX forums 上发布了这个问题. 嘿那里!在我的论文中,我正在编写一个 DSL 来描述图片的外观。这些图片将由 libGDX 根据 DSL-Input 绘制。目前,jetbrai
准备 SpringBoot 工程 1.新建 SpringBoot 项目,默认的端口是 8080 ,新建 Controller 和 Mapping @RestControllerpublic cla
我有类似的问题 this one 以下是我使用的: CDH4.4(配置单元 0.10) protobuf-java-.2.4.1.jar elephant-bird-hive-4.6-SNAPSHOT
我想使用 angularjs 和 angular-ui(特别是 ui-select2 功能)实现对选择输入的读/写访问控制。 场景很简单:通过使用 ng-readonly 属性,我可以控制用户是否可以
我是一名优秀的程序员,十分优秀!