- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的印象是 foldright
从列表末尾开始向后工作(这就是我想象的右关联的含义)。所以我很困惑以下内容适用于无限列表。
我有一个函数find
:
find :: (a -> Bool) -> List a -> Optional a
find p = foldRight (\c a -> if p c then Full c else a) Empty
注意以下工作:
>> find (const True) infinity
Full 0
我做了一些搜索并发现了这篇文章:How do you know when to use fold-left and when to use fold-right?
不幸的是,接受的答案并不是特别有用,因为右关联运算的示例是:
A x (B x (C x D))
这仍然意味着它需要首先执行最右边的事情。
我想知道是否有人可以帮我解决这个问题,谢谢。
最佳答案
让我们从一个函数开始:
>>> let check x y = if x > 10 then x else y
>>> check 100 5
100
>>> check 0 5
5
check
接受两个参数,但可能不使用第二个参数。由于 haskell 是惰性的,这意味着第二个参数可能永远不会被计算:
>>> check 20 (error "fire the missles!")
20
这种懒惰让我们跳过了可能无限的工作量:
>>> check 30 (sum [1..])
30
现在让我们使用等式推理逐步完成 foldr check 0 [0..]
:
foldr check 0 [0..]
= check 0 (foldr check 0 [1..]) -- by def'n of foldr
= foldr check 0 [1..] -- by def'n of check
= check 1 (foldr check 0 [2..]) -- by def'n of foldr
= foldr check 0 [2..] -- by def'n of check
-- ...
= foldr check 0 [10..]
= check 10 (foldr check 0 [11..]) -- by def'n of foldr
= foldr check 0 [11..] -- by def'n of check
= check 11 (foldr check 0 [12..]) -- by def'n of foldr
= 11 -- by def'n of check
请注意,惰性如何迫使我们从上到下进行评估,看看最外层函数调用如何(以及是否)使用其参数,而不是从下到上(在将所有参数传递给函数之前评估所有参数) ,就像严格的语言一样。
关于haskell - 为什么foldright适用于无限列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48654292/
有人可以告诉我这个函数定义有什么问题吗? def incr[Int](l: List[Int]): List[Int] = l.foldRight(List[Int]())((x,z) => (x
我是使用 Shapeless 的新手,我正在尝试使用 Shapeless 来自动生成类型类并折叠 HList。 我的目标是渲染 HList如 (a, b, c, d)使用 scalaz.Show 的类
我在 Programming in Scala 中阅读了有关折叠技术的信息书并遇到了这个片段: def reverseLeft[T](xs:List[T]) = (List[T]() /: xs) {
虽然经过Functional Programming in Scala ,我遇到了以下代码片段: def foldRight[A](z: => B)(f: (A,=>B) => B):B = unco
我刚刚发现 scala(我在 2.12 上)提供了完全不同的 实现。 foldRight 为 不可变列表 和 可变列表 . 不可变列表(List.scala): override def foldRi
A型水平foldRight工作正常 (getLabelWithValues),以及后续类型级别 map (getValues) 也可以正常工作。如果我将两者结合在一种方法 (getValuesFull
在一个在线类(class)中,有人说 foldLeft和 foldRight等效于 的运算符结合和交换 . 其中一名学生坚持认为此类运算符只需要具有关联性。所以这个属性对于函数组合和矩阵乘法等操作应该
以前,Nicolas Rinaudo回答了我关于 Scala 的 List foldRight Always Using foldLeft? 的问题 目前正在学习Haskell,我的理解是foldRi
我试试这个代码 println(listOf(1, 2, 4).foldRight(0) { total, next -> total - next
我正在使用 libraryDependencies += "com.chuusai"%% "shapeless"% "2.2.4" 目前我有像这样的模型 HList 类型 sealed trait S
我目前正在尝试 Scala 中的东西,试图习惯函数式编程以及再次学习一门新语言(自上次以来已经有一段时间了)。 现在给出一个字符串列表,如果我想将它们合并成一个长字符串(例如 "scala", "is
为什么编译器不翻译 Scala (1,2,3,4,5,6).foldRight(10)(_ * _) 相当于 Java final int[] intArray = new int[]{1,2,3,4
为什么foldLeft拿 f: (B, A) => B 并折叠右取 f: (A, B) => B foldLeft本来可以写成 f: (A, B) => B.我试图理解参数顺序差异的原因。 最佳答案
在经过时Functional Programming in Scala ,我遇到了这个问题: Can you right foldLeft in terms of foldRight? How abo
注意:我使用的是 Scala 2.8——这会是一个问题吗? 为什么我不能像 foldLeft 或 foldRight 一样使用 fold 函数? 在 Set scaladoc它说: The resul
我一直在用 .foldRight() 递归地实现高阶函数。喜欢 any , all , 和 takeWhile作为实践,但 dropWhile一直难以捉摸。 _Collections.kt具有命令式的
这个问题来源于我之前的问题:What does HList#foldLeft() return? 我有这个场景: class Cursor { } trait Column[T] { def r
我正在学习 Scala,并且是函数式编程领域的新手。我看到大多数方法,例如 foldRight、map、filter、reduce ... 总是可以由 foldLeft 编写(由 foldLeft 编
我必须仅使用 foldRight、foldLeft 和 unfold 来实现 Map 函数。这意味着我必须遍历列表中的每个元素并对其应用函数 f。 我已经声明了我自己的列表如下: abstract c
我是一名优秀的程序员,十分优秀!