Scala连接循环结果

时间:2012-11-27 12:35:16

标签: scala for-loop concatenation yield

我正在尝试将3个序列连接成具有yield的循环的个体结果。没有临时变量,我无法让它工作。有人知道更好的选择吗? notWorking版本在第一个++之后的方法“非法启动简单表达式”的第四行给出了编译器错误。

def working() : Seq[Seq[Elem]] = {
    val result = for(index <- 0 until COMPLETE_INPUT_CHANNELS) yield {
        getModesOfCompleteInputChannel(index)
    }
    val result2 = for(index <- 0 until INCOMPLETE_INPUT_CHANNELS) yield {
        getModesOfIncompleteInputChannel(index)
    }
    val result3 = for(index <- 0 until OUTPUT_CHANNELS) yield {
        getModesOfOutputChannel(index)
    }
    return result ++ result2 ++ result3
}

def notWorking() : Seq[Seq[Elem]] = {
    for(index <- 0 until COMPLETE_INPUT_CHANNELS) yield {
        getModesOfCompleteInputChannel(index)
    } ++ for(index <- 0 until INCOMPLETE_INPUT_CHANNELS) yield {
        getModesOfIncompleteInputChannel(index)
    } ++ for(index <- 0 until OUTPUT_CHANNELS) yield {
        getModesOfOutputChannel(index)
    }

3 个答案:

答案 0 :(得分:15)

这个解决方案怎么样?

val tasks = Seq(
    (COMPLETE_INPUT_CHANNELS, getModesOfOutputChannel),
    (INCOMPLETE_INPUT_CHANNELS, getModesOfIncompleteInputChannel),
    (OUTPUT_CHANNELS, getModesOfOutputChannel))

tasks flatMap {
    case (limit, processing) => 0 until limit map processing
}

答案 1 :(得分:6)

为什么不呢?

(0 until COMPLETE_INPUT_CHANNELS).map(getModesOfCompleteInputChannel) ++
(0 until COMPLETE_INPUT_CHANNELS).map(getModesOfIncompleteInputChannel) ++
(0 until OUTPUT_CHANNELS).map(getModesOfOutputChannel)

虽然我确实喜欢M.A.D的解决方案。很优雅。

答案 2 :(得分:2)

我相信,++此处被视为yield表达式的一部分。为了使其有效,只需将for理解包装在括号中。