Вчера в группе Perl 6 на Фейсбуке Solomon Foster показал вот такой пример:
my @x = FatRat.new(1, 1), -> $x { $x - ($x ** 2 - $N) / (2 * $x) } ... *;
В этом коде в одну строку реализован численный метод вычисления квадратного корня (методом Ньютона).
Давайте возьмем какое-то понятное число $N и посмотрим значение его корня на десятой итерации:
10.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000114617269858815597676188906948935679812072077815172636665039841545242611088386175405939458945274038752495996921868425893616324912131911758516481924280284021811361729487444582731688466773998426538733 . . .
Я показал только часть результата, в реальности цифр еще пять раз по столько же.
Что здесь примечательного?
Во-первых, тип FatRat — это дроби с произвольно большими числителем и знаменателем. Если использовать Rat, то мы довольно быстро придем к обычным числам с плавающей точкой.
Во-вторых, оператор последовательности вместе с встроенным генератором — отличный способ программировать подобные численные методы без организации циклов. Конечно, надо еще придумать, как остановиться при достижении нужной точности, но тем не менее, то что есть, уже выглядит довольно экспрессивно.