gpt4 book ai didi

haskell - ArrowLoop 是如何工作的?另外,mfix?

转载 作者:行者123 更新时间:2023-12-03 09:11:49 26 4
gpt4 key购买 nike

我现在对其余的箭头机械相当满意,但我不明白循环是如何工作的。这对我来说似乎很神奇,这对我的理解不利。我也很难理解 mfix。当我查看一段使用 rec 的代码时在 procdo block ,我很困惑。使用常规的 monadic 或箭头代码,我可以逐步完成计算并在脑海中保持对正在发生的事情的操作画面。当我到达 rec ,我不知道该保留什么图片!我被卡住了,我无法推理这样的代码。

我想了解的示例来自 Ross Paterson's paper on arrows ,关于电路的一个。

counter :: ArrowCircuit a => a Bool Int
counter = proc reset -> do
rec output <- returnA -< if reset then 0 else next
next <- delay 0 -< output+1
returnA -< output

我假设如果我理解了这个例子,我将能够理解循环,这将有助于理解 mfix。他们对我的感觉基本相同,但也许我错过了一个微妙之处?无论如何,我真正想要的是这些代码片段的操作图,所以我可以像“常规”代码一样在脑海中逐步浏览它们。

编辑 :感谢Pigworker的回答,我开始考虑rec之类的要求是否得到满足。以 counter例如,rec block 的第一行需要一个名为 output 的值。 .我想这在操作上就像创建一个盒子,给它贴上标签 output ,并要求 rec block 填充该框。为了填充该框,我们向 returnA 输入一个值,但该值本身需要另一个值,称为 next。 .为了使用这个值,必须在 rec block 中要求另一行,但现在在 rec block 中的哪个位置要求它并不重要。

所以我们转到下一行,我们找到标有 next 的框。 ,并且我们要求另一个计算来填充它。现在,这个计算需要我们的第一个盒子!所以我们给它一个盒子,但它里面没有任何值(value),所以如果这个计算需要 output的内容,我们遇到了一个无限循环。幸运的是,延迟获取了盒子,但在不查看盒子内部的情况下产生了一个值。这填充 next , 然后我们可以填写 output .现在 output填充,当处理这个电路的下一个输入时,前面的 output盒子将有它的值(value),准备好被要求以生产下一个 next ,因此下一个 output .

听上去怎么样?

最佳答案

在这段代码中,它们的关键部分是 delay 0 rec 中的箭头堵塞。要了解它是如何工作的,将值视为随着时间和时间而变化的切分切片会有所帮助。我认为这些切片是“天”。 rec block 解释了每天的计算是如何工作的。它是按值(value)而非因果顺序组织的,但如果我们小心的话,我们仍然可以追踪因果关系。至关重要的是,我们必须确保(没有任何类型的帮助)每天的工作依赖于过去而不是 future 。一日delay 0在这方面为我们争取了时间:它在一天后改变它的输入信号,通过给值 0 来处理第一天。延迟的输入信号是“明天的 next”。 ’。

rec     output <- returnA -< if reset then 0 else next
next <- delay 0 -< output+1

因此,查看箭头及其输出,我们提供了今天的 output但是明天的 next .查看输入,我们依赖于今天的 resetnext值(value)观。很明显,我们可以在没有时间旅行的情况下从这些输入中提供这些输出。 output是今天的 next号码,除非我们 reset为 0;明天, next号码是今天的 output的继任者.今日 next因此,值(value)来自昨天,除非没有昨天,在这种情况下它是 0。

在较低级别上,由于 Haskell 的懒惰,整个设置都可以正常工作。 Haskell 通过需求驱动的策略进行计算,因此如果存在尊重因果关系的任务顺序,Haskell 会找到它。在这里, delay建立这样的命令。

但是请注意,Haskell 的类型系统在确保这样的顺序存在方面给您提供的帮助很少。您可以随意使用循环来胡说八道!所以你的问题远非微不足道。每次您阅读或编写这样的程序时,您确实需要考虑“这怎么可能工作?”。您需要检查 delay (或类似的)被适本地使用以确保仅在可以计算信息时才需要信息。注意构造函数,尤其是 (:)也可以像延迟一样:计算列表的尾部并不罕见,显然给定整个列表(但只注意检查头部)。与命令式编程不同,惰性函数式风格允许您围绕事件序列以外的概念组织代码,但这是一种自由,需要对时间有更微妙的认识。

关于haskell - ArrowLoop 是如何工作的?另外,mfix?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6976944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com