什么是Scala中的F#seq monad

时间:2018-05-31 15:15:36

标签: scala f# seq scala-streams

我试图从F#转到Scala。在F#中,我们可以轻松地创建带有计算表达式或monad的seq。例如:

let myseq = seq {
    let mutableList = List()
    for i = 0 to 100 do
        mutableList.append(i)
        yield sum(mutableList)
 }

myseq |> Seq.iter println

我读到了scala Stream,但我不确定如何正确使用它,就像上面的例子一样,它包含一些状态在seq生成期间不断更新。

另一个例子是在seq中执行一些初始化和清理工作:

let myseq = seq {
    let file = open(path)
    while (x = read(file)) do
        yield x
    file.close() }

我们可以在scala中执行此操作吗?

1 个答案:

答案 0 :(得分:3)

Scala使用foryield关键字Sequence Comprehensions,如下例所示:

object ComprehensionTest extends App {
    def even(from: Int, to: Int): List[Int] =
        for (i <- List.range(from, to) if i % 2 == 0) yield i
    Console.println(even(0, 20))
}