reduce SOURCE as $VAR (INIT; REDUCTION)
эквивалентно
[ foreach SOURCE as $VAR (INIT; REDUCTION; .) ] | last
Наоборот,
foreach SOURCE as $VAR (INIT; UPDATE; EXTRACT)
эквивалентно
reduce SOURCE as $VAR (
{ state: ( INIT ), rv: [] };
.state |= ( UPDATE ) |
.rv += [ .state | EXTRACT ]
) | .rv[]
Как видите, они очень похожи. На самом деле практически идентичны.
reduce
, когда вам нужен один результат.foreach
, когда вы хотите получить результат для каждого ввода.Например, скажем, у нас есть следующий ввод:
["abc", "def", "ghi", "jkl", "mno"]
foreach .[] as $var (false; not; .)
производит
true
false
true
false
true
так
foreach .[] as $var (false; not; if . then $var else empty end)
производит
"abc"
"ghi"
"mno"
Спасибо, очень полезно! Если вы можете (или кто-то другой), было бы здорово, если бы это можно было добавить в руководство, поскольку эти операции могут быть сложными для новичков в функциональном мире.
Я не согласен. Это не способ объяснить их. Прежде всего, руководство не является учебным пособием, и руководство для reduce
будет больше похоже на это (за исключением части, упоминающей foreach
).
в любом случае ваше объяснение здесь помогло мне, в то время как единственный пример из руководства с «массивом массивов», используемым в качестве состояния для работы, был менее дружелюбным примером — для меня. Еще раз спасибо за помощь!
foreach
в некоторых отношениях лучше всего понимается процедурно, во-первых, потому что процедурное объяснение простое, а во-вторых, потому что оно точное — в чем можно убедиться, рассмотрев foreach
выражения, включающие break
утверждения.
почему отрицательное голосование? В самом руководстве говорится, что foreach является обобщенным сокращением. Поэтому я хотел бы знать, как написать сокращение, используя foreach, чтобы понять это. Должно быть легко! а мне совершенно непонятно.