Apr. 11th, 2012

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

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

Я довольно далек от формальных логик, преобразования программ, суперкомпиляции и проч., но может, кто подскажет, как современная наука смотрит на такие вещи? Может ли компилятор сам "додуматься" до эквивалентных преобразований функциональных выражений? Или это удел суперкомпиляции?

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. 8th, 2025 06:06 am
Powered by Dreamwidth Studios