作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
ArrowLoop
的函数实例包含
loop :: ((b,d) -> (c,d)) -> (b -> c)
loop f b = let (c,d) = f (b,d) in c
b -> c
来自
(b,d) -> (c,d)
?我的意思是,
c
在结果元组中可能取决于输入的两个元素,如何“切断”
d
的影响? ?
let
在这里工作。不包含
(c,d) = f (b,d)
d
的循环定义?
d
在哪里来自?老实说,我很惊讶这是有效的语法,因为看起来我们会重新定义
d
.
let
表达式必须以某种方式“搜索” d 的那个固定点(并且可能不止一个)。在我看来,这很接近魔术。还是我觉得太复杂了?
最佳答案
这与 fix
的标准定义相同。作品:
fix f = let x = f x in x
fix
does 中找到一个固定点: 递归。
loop (\((),xs) -> (xs, 1:xs)) ()
.这就像
fix (\xs -> 1:xs)
;我们忽略我们的输入,并使用
d
输出(此处为
xs
)作为我们的主要输出。元组中的额外元素
loop
has 只是包含输入参数和输出值,因为箭头不能进行柯里化(Currying)。考虑如何使用
fix
定义阶乘函数— 你最终会使用柯里化(Currying),但是当使用箭头时,你会使用额外的参数并输出
loop
给你。
loop
打结,让箭头访问自身的辅助输出,就像
fix
打结,使函数可以访问自己的输出作为输入。
关于haskell - 这个 ArrowLoop.loop 的定义是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9856342/
loop的描述来自 Control.Arrow : The loop operator expresses computations in which an output value is fed b
根据 Control.Arrow 文档,对于许多 monads(那些 >>= 操作是严格的)instance MonadFix m => ArrowLoop (Kleisli m)不满足 loop (
ArrowLoop 的函数实例包含 loop :: ((b,d) -> (c,d)) -> (b -> c) loop f b = let (c,d) = f (b,d) in c 首先我的签名有问题
我现在对其余的箭头机械相当满意,但我不明白循环是如何工作的。这对我来说似乎很神奇,这对我的理解不利。我也很难理解 mfix。当我查看一段使用 rec 的代码时在 proc或 do block ,我很困
跟随 this post 中优秀答案的引领,我正在尝试获取 ArrowLoop 的工作示例不使用箭头符号。在我完全理解箭头在引擎盖下的工作原理之前,我对使用箭头符号感到不舒服。话虽如此,我已经构建了一
我是一名优秀的程序员,十分优秀!