kaipa: (Default)
[personal profile] kaipa
Написал тут давеча такую строчку.

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. Так получилось, что они коммутативны, то есть можно в любом порядке их применять. Однако, очевидно, что эффективнее сначала список отфильтровать, а потом развернуть, а не наоборот.

Я довольно далек от формальных логик, преобразования программ, суперкомпиляции и проч., но может, кто подскажет, как современная наука смотрит на такие вещи? Может ли компилятор сам "додуматься" до эквивалентных преобразований функциональных выражений? Или это удел суперкомпиляции?
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

kaipa: (Default)
kaipa

April 2017

S M T W T F S
       1
2345678
9101112131415
16171819202122
23242526272829
30      

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 13th, 2025 01:11 am
Powered by Dreamwidth Studios