Scala列表,map和flatMap

时间:2017-03-09 20:13:32

标签: scala operators

我现在正在查看M.Odersky的书中的例子

List.range(1, 5) flatMap (
i => List.range(1, i) map (j => (i, j))
)

好的,首先我们创建1,2,3,4列表然后接下来会发生什么?

i => List.range(1, i)

在做什么?创建

(1,1)
(1,2)
(1,3)
(1,4)

是或否?

如果我试图逃避flatMap

scala> List.range(1,5) (i => List.range(1,i) map (j => (i, j)))
<console>:11: error: missing parameter type
       List.range(1,5) (i => List.range(1,i) map (j => (i, j)))

为什么?

1 个答案:

答案 0 :(得分:6)

了解某些代码的一种方法是将其插入REPL,将其分解为其组成部分,然后将其重新组合在一起。

def toPostfix(infix):
    stack = []
    postfix = ''

    for c in infix:
        if isOperand(c):
            postfix += c
        else:
            if isLeftParenthesis(c):
                stack.append(c)
            elif isRightParenthesis(c):
                operator = stack.pop()
                while not isLeftParenthesis(operator):
                    postfix += operator
                    operator = stack.pop()              
            else:
                while (not isEmpty(stack)) and hasLessOrEqualPriority(c,peek(stack)):
                    postfix += stack.pop()
                stack.append(c)

    while (not isEmpty(stack)):
        postfix += stack.pop()
    return postfix

好的,所以原始List的每个元素都成为一个新的子列表。让我们看看List.range(1,5) // List(1, 2, 3, 4), pretty simple List.range(1,5).map(i => i) // no change (map is simpler than flatMap) List.range(1,5).map(i => List.range(1, i)) res2: List[List[Int]] = List(List(), List(1), List(1, 2), List(1, 2, 3)) 做了什么。

flatMap

因此,如果List.range(1,5).flatMap(i => List.range(1, i)) res3: List[Int] = List(1, 1, 2, 1, 2, 3) 在列表中生成列表,则map将所有内容“展平”为单个列表。

继续使用这种试错法,测试和重新测试方法,您应该能够自己演示其余代码正在做什么(这就是创建结果元组的地方)。