May 31st, 2012

flow

Сложность, времена, модальности...

Навеяно http://ivan-gandhi.livejournal.com/1992504.html и http://dennisgorelik.livejournal.com/47564.html

Оба варианта некрасивы. "Императивный" оперирует низкоуровневыми понятиями, а в "функциональном" сложнозависимые времена смешиваются в одной строчке, препятствуя читаемости и верифицируемости. О временах подробнее:

doSomething(); doSomethingElse() -- сентенции находятся в общем времени и связаны отношением до/после.
a = sin(x); b = cos(x) -- сентенции находятся в общем времени, не связаны между собой отношением следования (но a и b могут быть вычислены только _после_ вычисления x).
values.map(_*3).filter(_<boundary) -- другие времена в лямбдах, но при отсутствии состояний вся сентенция воспринимается как простая и понятная труба до/после.
actors.map(_.SaveToStream(s)) -- другое время в лямбде + состояние, но мы легко можем проследить изменения состояния s в общем времени сентенции.
однако
val primes: Stream[Int] = 2 #:: Stream.from(3,2).filter( x=> !primes.takeWhile( _ <= sqrt(x) ).exists( x % _ == 0 ) ) -- дохрена сложносвязанных времён в одной строчке плюс два взаимозависимых состояния (вычисленная часть потока и takeWhile) в разных временах. А без сведения в одно время даже верификацию не провести.

Отсутствие состояний и связанных с ними проблем в функциональных языках это распространённое заблуждение. Просто там иные традиции маскировки (состояний, ... проблем? ;)

И ещё про complexity. Не всё может быть красивым, правильным и простым.