首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Y组合符是左折叠还是右折叠?

Y组合符既可以进行左折叠(left fold)也可以进行右折叠(right fold),取决于使用的编程语言和上下文中的约定。

在函数式编程中,Y组合符是一种高阶函数,用于实现递归定义的匿名函数。通过使用Y组合符,可以创建递归函数而无需使用具名函数或循环结构。Y组合符的使用方式如下所示:

Y = λf.(λx.f (x x)) (λx.f (x x))

左折叠指的是将Y组合符的应用放在递归定义的函数体之前,而右折叠指的是将Y组合符的应用放在递归定义的函数体之后。具体的折叠方式取决于如何使用Y组合符。

左折叠方式下,Y组合符的应用出现在递归定义的函数体之前,这意味着在函数求值时,递归调用会在之后发生。左折叠适用于需要在递归调用之前进行一些操作的场景。

右折叠方式下,Y组合符的应用出现在递归定义的函数体之后,这意味着在函数求值时,递归调用会在之前发生。右折叠适用于需要在递归调用之后进行一些操作的场景。

需要注意的是,不同的编程语言和编程范式可能对Y组合符的折叠方式有不同的约定。因此,在具体的编程环境中,需要查阅相关的文档或资料来确定Y组合符的折叠方式。

对于腾讯云相关产品的推荐和介绍,由于不提及具体云计算品牌商,请在相关文档和官方网站上查询腾讯云的产品和服务,以获取相关信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

值引⽤与移动语义

⼀个值被值引⽤绑定后,值引⽤变量变量表达式的属性值 int&& rr1 = 10; double&& rr2 = x + y; double&& rr3 = fmin(x, y); string...引用折叠 什么引用折叠? 引用折叠指的是当我们使用模板和类型别名(typedef)时,组合不同类型的引用会产生新的引用类型。...C++11 规定了一些折叠规则来处理这些情况: 值引用的值引用折叠值引用。 所有其他组合(如左值引用与值引用、值引用与值引用等)都折叠值引用。 为什么需要引用折叠?...引用折叠使得在模板中使用引用时,能根据实际传入的参数类型自动决定使用值引用还是值引用,从而提高性能。...如下所示: f1(T& x) 总是实例化为值引用,因为无论传入的还是值,T& 都不发生变化。 f2(T&& x) 根据传入的参数类型,实例化为值引用或值引用。

11710

C++17常用新特性(十一)---折叠表达式

同样,如果将Sum函数进行改写,重新运行后虽然结果相同,但是折叠表达式展开后各个参数的组合就发生了变化。...template auto sum_c(T ...args) { return (args+...); } 2 使用折叠表达式 在上面的例子中,给定一个参数和一个操作后不管折叠还是折叠都能够将折叠表达式展开为下面的形状...: 折叠:((arg1 op arg2) op arg3) op … 折叠:arg1 op (arg2 op … (argN­1 op argN)) 前面的代码我们对数值型数据进行求和,如果要在字符传进行...<<endl; 如上所述,在实际编写代码时,当传入参数的顺序发生变化时,折叠或者折叠也会产生不同的编译结果。 在实际使用时,我们更推荐使用折叠。因为这个更加符合大众的思维。...在此需要明确一点的对于逗号运算不管折叠还是折叠输出的结果都是一样的。函数的执行顺序都是从左向右。 上面折叠应用在函数中,下面将讨论将折叠使用在类中,作为类的基类进行调用。

1.4K20
  • C++17 fold expression

    C++17解决了这个问题,通过fold expression(折叠表达式)简化对参数包的展开。 2.语法形式 折叠表达式共有四种语法形式,分别为一元的折叠折叠,以及二元的折叠折叠。...一元折叠(unary left fold) ( ... op pack ) 一元折叠(... op E)展开之后变为 ((E1 op E2) op ...) op En 一元折叠(unary right....* ->* 3.使用实例 (1)一元折叠 从表达式右边开始fold,看它是left fold还是right fold我们可以根据参数包…所在的位置来判断,当参数包…在操作右边的时候就是right...对于+这种满足交换律的操作来说,left fold和right fold一样的,比如上面的例子你也可以写成left fold。...二元fold的语义和一元fold的语义相同的,参数包…在即二元折叠,参数包…在折叠

    1.8K30

    C++ 值和

    值和值 在C++11之前,一个变量分为值和值:可以放在=运算左边的值,有名字,可以用&运算取地址(如 int n = 10;n即为值);值则是只能放在=运算右边,没有名字,不能用...万能引用不是一种引用类型,而是会根据T的推导结果,决定其究竟是一个值引用还是值引用。...&&; 如果T根据实参推导时: 若实参为值, T 推导出值引用(如int&),T&& 的结果仍然值引用,int& && 折叠成了 int&; 若实参为值, T 推导出实际类型(如int)...无论T还是值,最后只获取它的类型部分。...std::move的功能: //传递实参的值,推导_Arg为值引用,仍旧static_cast转换为值引用。

    1.2K181

    C++11移动语义与值引用

    这里给值下个定义:只能出现在赋值运算右边的表达式才是值。相应的,能够出现在赋值运算左边的表达式就是值,注意,值也可以出现在赋值运算的右边。...: (1)值一般可寻址的变量,值一般不可寻址的字面常量或者在表达式求值过程中创建的可寻址的无名临时对象; (2)值具有持久性,值具有短暂性。...因为值引用本身值,当一个值引用类型作为函数的形参,在函数内部再转发该参数的时候它实际上一个值,并不是它原来的值引用类型了。...比如,当转发函数的实参类型X的一个值引用,那么模板参数被推导为X&,当转发函数的实参类型X的一个值引用的话,那么模板的参数被推导为X&&类型。再结合引用折叠规则,就能确定出参数的实际类型。...简单总结为: (1)所有值引用折叠值引用上仍然一个值引用; (2)所有的其他引用类型之间的折叠都将变成值引用。

    1.1K20

    Vim 快捷命令

    VIM 移动 以字()为单位 功能 按键 上 k 下 j h l 以单词为单位 功能 按键 前一个单词尾 ge 后一个单词首 w 本单词首(已在本词首则跳到前一单词首) b 本单词尾(已在本词尾则跳到后一单词尾...) e 以屏幕为单位 功能 按键 向下翻页 CTRL-f 向上翻页 CTRL-b 向下翻半页 CTRL-d 向上翻半页 CTRL-u 向上一行 CTRL-y 向下一行 CTRL-e 光标移到屏幕上方...可以使用 | 来组合命令,比如 cmd1 | cmd2。...代码 功能 按键 格式化代码 gg=G 去除 1-20 行首的行号 :1,20s/^\\s\*[0-9]\*\\s\*//g 展开全部折叠 zR 展开当前层级折叠 zr 全部折叠 zM 当前层级折叠 zm...切换折叠/展开 za 递归折叠/展开当前大区块 zA 折叠当前区块 zc 递归折叠当前大区块 zC 展开当前区块 zo 递归展开当前大区块 zO 格式化 json 数据 :%!

    77110

    C++中的万能引用和完美转发

    func(2019); return 0; } 输出结果: 传入的值 传入的值 第一次函数调用的值得版本,第二次函数调用的值版本。...一个模板函数,根据定义的形参和传入的实参的类型,我们可以有下面四中组合值-值 T& & # 函数定义的形参类型值引用,传入的实参值引用 值-值 T& && #...函数定义的形参类型值引用,传入的实参值引用 值-值 T&& & # 函数定义的形参类型值引用,传入的实参值引用 值-值 T&& && # 函数定义的形参类型值引用...,传入的实参值引用 但是C++中不允许对引用再进行引用,对于上述情况的处理有如下的规则: 所有的折叠引用最终都代表一个引用,要么值引用,要么值引用。...()函数中调用func()中传入的参数也应该是值;第二个warp()函数调用实参值,根据上面所说的引用折叠规则,warp()函数接收的参数类型值引用,那么为什么却调用了调用func()的值版本了呢

    55830

    XCode快捷键

    编辑 CMD + [: 缩进 CMD + ]: 缩进 CMD + CTRL + LEFT: 折叠 CMD + CTRL + RIGHT: 取消折叠 CMD + CTRL + TOP: 折叠全部函数...CMD + CTRL + BOTTOM: 取消全部函数折叠 CTRL + U: 取消全部折叠 CMD + D: 添加书签 CMD + /: 注释或取消注释 CTRL + .: 参数提示 ESC:...+ \: 允许或禁用当前断点 CMD + OPT + B: 查看全部断点 CMD + RETURN: 编译并运行(根据设置决定是否启用断点) CMD + R: 编译并运行(不触发断点) CMD + Y:...窗体 CMD + SHIFT + B: 编译窗口 CMD + SHIFT + Y: 调试代码窗口 CMD + SHIFT + R: 调试控制台 CMD + SHIFT + E: 主编辑窗口调整 5....(句点):反向循环浏览代码提示 Ctrl + / :移动到代码提示中的下一个占位 Command + Ctrl + S :创建快照 Ctrl + F :前移光标 Ctrl + B :后移光标 Ctrl

    95570

    CSS进阶07-浮动Floats

    float 这个属性指定一个盒子应该向左浮动,向右浮动还是不浮动。它可以被任何元素设置,但仅适用于生成非绝对定位盒的元素。该属性值具有如下含义: left 该元素生成一个浮动到左侧的块盒。...以下控制浮动行为的准则: 浮动盒的外边缘不可在其包含块的左边缘之左。浮动元素亦是。...如果当前盒浮动,而此前源文档中已有元素生成了浮动盒,那么对每个此前生成的盒而言,要么当前盒的外边缘在此前生成盒的外边缘之右,要么当前盒的顶部必须低于此前生成盒的底部。浮动元素亦是。...浮动盒的外边缘不可在其旁边的浮动盒的外边缘之右。浮动元素亦是。 浮动盒的上外边缘不可高于其包含块的顶部。当浮动出现两个折叠外边距之间时,浮动会如同它有一个参与标准流的空匿名父块一样来定位。...第一种方法把 B2 的顶部top和 F 的底部bottom齐平,即,放在 y= M1+H 。

    1.5K40

    C++中的万能引用和完美转发

    func(2019); return 0; } 输出结果: 传入的值 传入的值 第一次函数调用的值得版本,第二次函数调用的值版本。...一个模板函数,根据定义的形参和传入的实参的类型,我们可以有下面四中组合值-值 T& & # 函数定义的形参类型值引用,传入的实参值引用 值-值 T& && #...函数定义的形参类型值引用,传入的实参值引用 值-值 T&& & # 函数定义的形参类型值引用,传入的实参值引用 值-值 T&& && # 函数定义的形参类型值引用...,传入的实参值引用 但是C++中不允许对引用再进行引用,对于上述情况的处理有如下的规则: 所有的折叠引用最终都代表一个引用,要么值引用,要么值引用。...()函数中调用func()中传入的参数也应该是值;第二个warp()函数调用实参值,根据上面所说的引用折叠规则,warp()函数接收的参数类型值引用,那么为什么却调用了调用func()的值版本了呢

    3.8K40

    C++11——对象移动与值引用

    这里给值下个定义:只能出现在赋值运算右边的表达式才是值。相应的,能够出现在赋值运算左边的表达式就是值,注意,值也可以出现在赋值运算的右边。...:将rr2绑定到乘法结果上 从上面可以看到值与值的区别有: (1)值一般可寻址的变量,值一般不可寻址的字面常量或者在表达式求值过程中创建的可寻址的无名临时对象; (2)值具有持久性...string&& s3=std::move(s1); //正确:在赋值之后,s1的值不确定的 关于引用折叠: 引用折叠指的是值引用与值引用相互赋值时会发生类型的变化,...变化规则为: (1)所有值引用折叠值引用上仍然一个值引用。...移动赋值运算: 移动赋值运算类似于赋值运算,进行的资源的移动操作而不是拷贝操作从而提高了程序的性能,其接收的参数也是一个类对象的值引用。移动赋值运算必须正确处理自赋值。

    85920

    C++进阶:C++11(列表初始化、值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

    例如: int x = 10; decltype(x) y = 20; // y的类型为int,与x相同 这里decltype(x)就是一个类型 3.值引用和移动语义 3.1值与一个表示数据的表达式...定义时const修饰后的值,不能给他赋值,但是可以取它的地址。...一个临时的、无法被修改的值,因此在传值返回时,编译器会将该临时对象隐式地添加 const 修饰,使其成为一个常量对象 3.2值引用与值引用 我们之前使用的引用都是值引用,那么现在值引用就是...完美转发通常与模板和引用折叠相关联,并在实现泛型代码时非常有用。 引用折叠: 引用折叠 C++11 中的一个规则,用于确定引用的最终类型。...在模板中使用引用时,引用可能会发生折叠,最终得到值引用或值引用。 引用折叠规则:T& & 折叠为 T&,T&& && 折叠为 T&&,T& && 和 T&& & 都折叠为 T&。

    10700

    泛函编程(22)-泛函数据类型-Monoid In Action

    在这一节我们将把重点放在一些实用综合类型(composite type)Monoid实例及Monoid的抽象表达及函数组合能力。    ...Monoid的二元操作函数具有结合特性(associativity),与恒等值(identity)共同应用可以任意采用折叠折叠算法处理串类元素(List element)而得到同等结果。...所以使用Monoid op我们可以得出折叠等于折叠的结论: 折叠:op(op(op(a,b),c),d) 折叠:op(a,op(b,op(c,d))) 但是,如果能够用并行算法的话就是: 并行算法...,b1)),Some((x2,y2,b2))) => Some(x1 min x2,y1 max y2, b1 && b2 && x2 >= y1) 8 } 9...这是因为Tree类型没有现成的折叠算法。再就是Tree类型没有空值(只有Leaf, Branch)。这个特性暗示着有些类型的Monoid没有恒等值的。我们统称这些类型为semigroup。

    1.1K60

    【笔记】C++2.0新特性

    原本定义上值指允许被放在赋值运算左右的值....值在赋值运算左右都可以放置, 值只能放在右侧, 如下代码: // 有名称的变量都属于左值 int x=0, y=0; // x值, 可以被赋值, 右边立即数1, 值 x=1; // x和...y都是值, 值可以被作为值使用 x=y; // x+1临时变量, 属于值, 不应放于左边, 所以这句话编译不能通过 x+1=2; // ERROR // x+1临时存在的, 属于值, y...值, 所以这里可以通过 y=x+1; 但是由于类设计机制的复杂性, 传统的值和值定义只对于基础类型成立, 对自定义类并不成立....值引用依然一种引用, 其并不会改变对象的声明周期, 真正改变声明周期的还是我们自己的操作.

    90120

    wxss学习系列《二》尺寸(Dimension),外边距(margin)和内边距(padding)

    三.注意点: 虽然有很多的选择,不过在小程序中还是尽量用rpx吧,省的适配。...margin: 20rpx 10rpx 25rpx 10rpx :如果提供全部四个参数值,将按上、、下、的顺序作用于四边。 margin:20rpx:如果只提供一个,将用于全部的四边。...注意:margin折叠常规认知: margin折叠只发生在块级元素上; 浮动元素的margin不与任何margin发生折叠; 设置了属性overflow且值不为visible的块级元素,将不与它的子元素发生...margin折叠; 绝对定位元素的margin不与任何margin发生折叠; 根元素的margin不与其它任何margin发生折叠....padding: 20rpx 10rpx 25rpx 10rpx :如果提供全部四个参数值,将按上、、下、的顺序作用于四边。 padding:20rpx:如果只提供一个,将用于全部的四边。

    1.9K60

    【C++】值引用(极详细版)

    c = 2; // 以下几个都是常见的值 10; x + y; fmin(x, y); } 2.值引用和值引用的概念 那么我们就可以很容易地知道:  值引用:给值取别名 值引用:给值取别名...所以我们会想,有没有这么一个东西,自动去识别我们传的参数还是值,不会因为值引用而改变值属性。...我们继续往下看 1.万能引用 当并不明确规定传值或者值时:  万能引用在这里起到了用处,可以随便传。(也叫做折叠)模板中的&&不是值引用,而是为了万能引用,可以折叠。...当传值时,就把两个&&折叠为一个。...同理可得 但是在继续调用Fun时,还是会因为属性导致结果并不是我们需要的: 走到调用fun(t)时,还是会因为值引用导致值变为值,所以又出来了完美转发: template

    1.4K20

    【笔记】《C++Primer》—— 第16章:模板与泛型编程

    (正常情况下无法定义),会产生引用的“折叠”,(X&)&,(X&)&&,(X&&)&都折叠为X&,(X&&)&&折叠为X&&,也就是删去两个引用 所以如果给值引用参数传递值,则应用特例1得(int...)&&->int&,(const int)&&->const int&;如果给值引用参数传递值引用,则发生折叠,结果(int&)&&->int&,即值引用不变。...t,这样便确定下返回值t&& // 如果值,则直接加上值引用并正确返回 // 再回去看模板函数的参数,发现此时的实参T&&则由两种情况,t&&或(t&)&&,发生引用折叠得...,我们不能隐式将值转为值引用,但是可以用static_cast显式转换且这个这个对值的截断安全的 看了move的实现后尽管我们可以自己实现值到值引用的转换了,但是还是推荐用move,这样让代码更统一可靠...utility文件中的forward函数,这个函数利用引用折叠特性让值引用返回值引用,值返回值引用,正好就达到了恢复属性的目标。

    1.5K30
    领券