我现在正在查看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)))
为什么?
答案 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
将所有内容“展平”为单个列表。
继续使用这种试错法,测试和重新测试方法,您应该能够自己演示其余代码正在做什么(这就是创建结果元组的地方)。