Оригинал статьи под авторством M. Douglas McIlroy

Эти функции Хаскела осуществляют операции по степенному ряду. Ряд представлен как список числовых коэффициентов и понимаются формально; конвергенция не является проблемой.

Поскольку списки неограниченны по длине, необходимо «ленивое» вычисление.

Дополнительные правила для пустых списков позволят операциям работать на конечной длины полиномах и позволит вынужденным сколярам быть конечными рядами.

Ссылка: M. D. McIlroy, Музыка потоков (The music of streams),
Обработка данных в письмах 77 (2001) 189-195.

Определение функции

У ряда переменных есть суффикс s, или t, когда это хвост.
Страница с пояснениями освещает некоторые детали формул, которые отмечены как ссылки.
Добавить сколяры в ряд
series f = f : repeat 0
fromInteger c = series(fromInteger c)
Взятие обратного знака
negate (f:ft) = -f : -ft
Прибавление
(f:ft) + (g:gt) = f+g : ft+gt
Умножение
(f:ft) * gs@(g:gt) = f*g : ft*gs + series(f)*gt
Деление
(f:ft) / (g:gt) = qs where qs = f/g : series(1/g)*(ft-qs*gt)
Вычитание, целая степень
Для этих операций мы опираемся на исходные определения Хаскела такие, как вычитание представленное как прибавление и взятие обратного знака,
обмен (recip) представленное как деление, неотрицательная целая степень (^) представленная как умножение, и общая целая степень (^^) представленная как (^) и обмен.
Композиция (#)
(f:ft) # gs@(0:gt) = f : gt*(ft#gs)
Реверсия (композиционный обратный порядок)
revert (0:ft) = rs where rs = 0 : 1/(ft#rs)
Интегрирование
int fs = 0 : zipWith (/) fs [1..] — integral from 0 to x
Дифференцирование
diff (_:ft) = zipWith (*) ft [1..]  — type (Num a,Enum a)=>[a]->[a]
Примеры
Преобразование типа данных позволяет рассматривать сжатые письменные полиномы как степенные ряды
Таким образом 1+x2 может быть написан как 1+(0:1) 2 or 1:0:1, и раскрыт ниже чтобы определить ряд для tan x как ряд для его функционального обратного порядка, arctan x = ∫dx/(1+x2).
tans = revert(int(1/(1:0:1)))
Из обычного дифференцирования отношений между синусом и косинусом следует код подсчитывающий их степенные ряды.  «Ленивые» вычисления обеспечивают взаимную рекурсию.
sins = int coss
coss = 1 — int sins
Когда операции обобщаются для того чтобы сохранять полиномы конечными, коэффициенты степенных рядов могут и сами быть (конечными) степенными рядами.  Тогда тождество
1/(1−(1+x)z) = Σ(1+x)nzn ведет к генератору треугольника Паскаля:
pascal = 1/[1, −[1,1]]
Это формула расширяется к списку рядов:
[[1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1], …]::[[Rational]]
Завершенный пакет программ
Вышеуказанный код плюс несколько строк описания создают рабочий основной базовый пакет программ.
Для быстрого теста, попробуйте взять 10 tans. Это приводит в действие все операции кроме diff.
(Извините, расширение пакетов .txt, чтобы подходили для некоторых браузеров. Некоторые браузеры воспроизводят знаками минус в этих программах как дефисы на экране)
Расширения для полиномов приводят к увеличению практического пакета программ в два раза, это не так уж красиво, но зато он намного быстрее и совместим с например pascal.
Чтоб увидеть резкий скачок в скорости, попробуйте больший тест, например, take 20 tans.
Почему конечность более сложная чем бесконечность? Должен быть определен конец.
Колофон (концовка)
Написано Doug McIlroy
[email protected]
July 2007
Aug 2007. Текст, но не код, немного изменен
Sep 2007. Опечатка в определении sins исправлена; OK в завершенном пакете программ.
Пояснительная страница и треугольник Паскаля были добавлены. Минимальные изменения в тексте.
Mar 2008. Переделка введения.
Apr 2008. Ссылка на кода для пояснения.
Изменили определенный дефисы на знаки минуса. Объяснен и исправлен Enum nuisance.
Jul 2008. Небольшая правка текста.
Sep 2009. Упоминается operator (^^).   Сокращенное умножение на 0 в практическом пакете.
Oct 2009. Упоминается recip.
Apr 2012. Странице переведена на румынский Alexandra Seremina.
Mar 2013. Исправление опечатки в пояснениях.
Nov 2013. Упрощено определение pascal. Переделан набор текста формул в объяснениях.
Dec 2013. Замена расширения файла пакета с .hs на .txt чтоб удовлетворить браузеры.
Feb 2014. Показано расширение pascal.
Sep 2016. Исправление одного слова в тексте.
Jan 2017. Ditto. Удовлетворить GHC вступление по умолчанию добавлением (Eq a) tв контексты.
Более уместное int и diffв практическом пакете; это отражено в пересмотренном объяснении.
May 2017. Переделаны объяснения преобразование типа данных и примера pascal.
Обычные изменения в пунктуационных знаках.
Oct 2017. Еще большая переработка объяснения преобразование типа данных; удален — комментарий
Mar 2018. Разрешена неоднозначность объяснения умножения: заменить F'(g+xG) на (F’)(g+xG).