相关疑难解决方法(0)

表达式与Scala中的foreach

我正在通过Scala中的Programming工作,虽然我很想从Python的角度来看待事物,但我不想编写"Scala中的Python".

就控制流程来说,我不太清楚要做什么:在Python中,我们习惯于for x in some_iterable死亡,我们喜欢它.Scala中存在一个非常相似的构造,Odersky调用for 表达式,可能是为了将它与Java for循环区分开来.此外,foreach对于可迭代数据类型,Scala有一个属性(我想它将是一个属性,我不太了解Scala的名称).但是,foreach除了为容器中的每个项调用一个函数之外,似乎我不能做更多的工作.

这给我留下了一些问题.首先,表达式是Scala中的重要/大量使用的构造,就像它们在Python中一样;其次,我何时应该使用foreach而不是for表达式(除了在容器的每个项目上调用函数的明显情况之外)?

我希望我不是非常暧昧或过于宽泛,但我只想尝试Scala中的一些设计/语言基础(到目前为止看起来非常酷).

foreach loops scala

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

使用Scala continuation实现yield(yield return)

如何yield return使用Scala continuation 实现C#?我希望能够以Iterator相同的风格编写Scala .这篇Scala新闻帖的评论中有一个刺,但它不起作用(尝试使用Scala 2.8.0测试版).一个相关问题的答案表明这是可能的,但是虽然我已经玩了一段时间的分隔延续,但我似乎无法完全理解如何做到这一点.

continuations scala yield yield-return scala-2.8

27
推荐指数
2
解决办法
6871
查看次数

Scala是否与C#yield相当?

我是Scala的新手,据我所知,Scala中的收益与C#中的收益不同,它更像是选择.

Scala有类似于C#的收益吗?C#的收益很好,因为它使编写迭代器变得非常容易.

更新:这是来自C#的伪代码示例,我希望能够在Scala中实现:

public class Graph<T> {
   public IEnumerable<T> BreadthFirstIterator() {
      List<T> currentLevel = new List<T>();
      currentLevel.add(_root);

      while ( currentLevel.count > 0 ) {
         List<T> nextLevel = new List<T>();
         foreach( var node in currentLevel ) {
            yield return node;
            nextLevel.addRange( node.Children );
         }
         currentLevel = nextLevel;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

此代码实现了图的迭代广度优先遍历,使用yield,它返回一个迭代器,以便调用者可以使用常规for循环遍历图,例如:

graph.BreadthFirstIterator().foreach( n => Console.WriteLine( n ) );
Run Code Online (Sandbox Code Playgroud)

在C#中,yield只是语法糖,可以很容易地编写迭代器(IEnumerable<T>在.Net中,类似于IterableJava).作为迭代器,它的评估很懒散.

更新II:我可能在这里错了,但我认为C#中的整个收益点是你不必编写更高阶函数.例如,你可以编写一个常规for循环或使用像select/ map/ filter/ 这样的方法,where而不是传入一个函数,然后遍历序列.

graph.iterator().foreach(n => println(n))代替graph.iterator( …

c# scala yield

24
推荐指数
2
解决办法
5195
查看次数

标签 统计

scala ×3

yield ×2

c# ×1

continuations ×1

foreach ×1

loops ×1

scala-2.8 ×1

yield-return ×1