- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
loop
的描述来自 Control.Arrow
:
The loop operator expresses computations in which an output value is fed back as input, although the computation occurs only once. It underlies the rec value recursion construct in arrow notation.
(->)
的实例化:
class Arrow a => ArrowLoop a where
loop :: a (b,d) (c,d) -> a b c
instance ArrowLoop (->) where
loop f b = let (c,d) = f (b,d) in c
fix
,定点组合器:
fix :: (a -> a) -> a
fix f = let x = f x in x
loop
通过 fix
? 最佳答案
fix
:loop f b = let (c, d) = f (b, d) in c
loop f b = fst $ let (c, d) = f (b, d) in (c, d)
loop f b = fst $ let x = f (b, d) in x
loop f b = fst $ let x = f' x in x
where f' (_, d) = f (b, d)
loop f b = fst $ fix $ f . (b,) . snd
fix f = loop (join (,) . f . snd) ()
loop
和 fix
在谈论 (->)
时同样强大.那么,如果箭头用于泛化函数,为什么是 ArrowLoop
不是这样定义的?class Arrow a => ArrowLoop a where
fix :: a b b -> b
Arrow a
, a b c
是一种计算 c
的方法来自 b
.如果 ArrowLoop
被定义为直接概括 fix
,那么它就会严重瘫痪。 fix
必须在没有任何上下文的情况下“执行”该过程并直接生成 b
类型的值,表示“进程”a b b
不能,例如执行IO
.或者,考虑箭头newtype LT i o = LT { runLT :: [i] -> [o] }
fix
你会喜欢它将产生 [b]
来自 LT b b
,但事实并非如此。loop
是绕过这些限制的一种方法。它将过程作为参数并产生过程作为结果。从某种意义上说,与第一个进程相关的所有上下文都可以在第二个进程中保留下来,如果 loop
是不可能的。更像 fix
.fix
的模拟。对于 ArrowLoop
年代:-- resulting process ignores its input
fix' :: ArrowLoop a -- taking an impl of loop as argument
=> a b b -> a u b
fix' f = loop ((id &&& id) . f . arr snd)
-- take off the outer application to () (application means (->), after all)
-- and arrowify: join (,) = id &&& id; snd = arr snd; (Prelude..) = (Control.Category..)
-- but the RHSs are more general
loop' :: Arrow a => (forall x u. a x x -> a u x) -- taking an impl of fix' as argument
-> a (b, d) (c, d) -> a b c
ArrowLoop
在 fix'
任何一个。 关于loops - 修复与 ArrowLoop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51758376/
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 的工作示例不使用箭头符号。在我完全理解箭头在引擎盖下的工作原理之前,我对使用箭头符号感到不舒服。话虽如此,我已经构建了一
我是一名优秀的程序员,十分优秀!