Написал тут давеча такую строчку.
Это преобразование:
Если отбросить Option, то надо было просто в списке пар сгрупировать по второму элементу, который тоже пара, и развернуть. Скаловский метод groupBy не очень удобен для этой цели, как оказалось, приходится потом "вырезать" лишнее.
Но я не об этом. Поскольку преобразование довольно нетривиальное, его можно совершить разными "путями", возможно, с разной эффективностью. Например, раскрывать, Option можно в самом конце. Чтобы было понятно, о чем я, возьмем более простой пример, на котором это очевидно. Предположим, нам над списком надо совершить две операции: filter и reverse. Так получилось, что они коммутативны, то есть можно в любом порядке их применять. Однако, очевидно, что эффективнее сначала список отфильтровать, а потом развернуть, а не наоборот.
Я довольно далек от формальных логик, преобразования программ, суперкомпиляции и проч., но может, кто подскажет, как современная наука смотрит на такие вещи? Может ли компилятор сам "додуматься" до эквивалентных преобразований функциональных выражений? Или это удел суперкомпиляции?
val dam = (for ( (m, da) <- mda; (d, oa) <- da; a <- oa) yield ((d,a), m)).groupBy(_._1).map( x => (x._1, x._2 map (_._2)))
Это преобразование:
List[(M, List[(D, Option[A])]) -> Map[(D, A), List[M]]
Если отбросить Option, то надо было просто в списке пар сгрупировать по второму элементу, который тоже пара, и развернуть. Скаловский метод groupBy не очень удобен для этой цели, как оказалось, приходится потом "вырезать" лишнее.
Но я не об этом. Поскольку преобразование довольно нетривиальное, его можно совершить разными "путями", возможно, с разной эффективностью. Например, раскрывать, Option можно в самом конце. Чтобы было понятно, о чем я, возьмем более простой пример, на котором это очевидно. Предположим, нам над списком надо совершить две операции: filter и reverse. Так получилось, что они коммутативны, то есть можно в любом порядке их применять. Однако, очевидно, что эффективнее сначала список отфильтровать, а потом развернуть, а не наоборот.
Я довольно далек от формальных логик, преобразования программ, суперкомпиляции и проч., но может, кто подскажет, как современная наука смотрит на такие вещи? Может ли компилятор сам "додуматься" до эквивалентных преобразований функциональных выражений? Или это удел суперкомпиляции?