相关疑难解决方法(0)

你怎么知道何时使用fold-left以及何时使用fold-right?

我知道fold-left会产生左倾的树木,右倾的树木产生右倾的树木,但是当我伸手去拿折叠时,我有时会发现自己陷入了引发头痛的想法,试图确定哪种折叠是合适的.我通常最终会解决整个问题并逐步执行fold函数,因为它适用于我的问题.

所以我想知道的是:

  • 确定是向右折叠还是向右折叠有哪些经验法则?
  • 考虑到我面临的问题,我如何快速决定使用哪种类型的折叠?

Scala by Example(PDF)中有一个示例,它使用折叠编写一个名为flatten的函数,该函数将元素列表列表连接成一个列表.在这种情况下,右侧折叠是正确的选择(考虑到列表连接的方式),但我必须考虑一下才能得出结论.

由于折叠是(功能)编程中的常见操作,因此我希望能够快速,自信地做出这些决策.所以...任何提示?

language-agnostic functional-programming fold

98
推荐指数
4
解决办法
2万
查看次数

fold和foldLeft或foldRight之间的区别?

注意:我在使用Scala 2.8-can这是一个问题?

为什么我不能使用fold功能的方式相同foldLeftfoldRight

Set scaladoc中它说:

折叠的结果可能只是此并行集合的类型参数的超类型T.

但我T在函数签名中看不到任何类型参数:

def fold [A1 >: A] (z: A1)(op: (A1, A1) ? A1): A1
Run Code Online (Sandbox Code Playgroud)

foldLeft-Right和之间的区别是什么fold,以及如何使用后者?

编辑:例如,如何编写折叠以添加列表中的所有元素?有了foldLeft它将是:

val foo = List(1, 2, 3)
foo.foldLeft(0)(_ + _)

// now try fold:
foo.fold(0)(_ + _)
>:7: error: value fold is not a member of List[Int]
  foo.fold(0)(_ + _)
    ^
Run Code Online (Sandbox Code Playgroud)

scala fold

63
推荐指数
3
解决办法
2万
查看次数

Scala的'::'运算符,它是如何工作的?

在Scala中,我可以创建一个caseclass,case class Foo(x:Int)然后将它放在一个列表中,如下所示:

List(Foo(42))
Run Code Online (Sandbox Code Playgroud)

现在,这里没什么奇怪的.以下对我来说很奇怪.运算符::是列表中的函数,对吧?对于Scala中有一个参数的任何函数,我可以用中缀表示法调用它.一个例子是对象的1 + 2一个函数.我刚刚定义的类没有运算符,那么以下可能如何?(+)IntFoo::

Foo(40) :: List(Foo(2))
Run Code Online (Sandbox Code Playgroud)

在Scala 2.8 RC1中,我从交互式提示中获得以下输出:

scala> case class Foo(x:Int)
defined class Foo

scala> Foo(40) :: List(Foo(2))
res2: List[Foo] = List(Foo(40), Foo(2))
Run Code Online (Sandbox Code Playgroud)

我可以继续使用它,但解释是什么?

scala list operator-keyword

54
推荐指数
4
解决办法
2万
查看次数

concat中foldRight和foldLeft之间有什么区别

为什么我不能在以下代码中使用fold Left:

def concatList[T](xs: List[T],ys:List[T]): List[T]=
     (xs foldLeft ys)(_::_)
Run Code Online (Sandbox Code Playgroud)

实际上我很难理解foldRight和foldLeft之间的区别,有没有例子来说明真正的差异?

谢谢.

scala

1
推荐指数
1
解决办法
225
查看次数