как часть homework (с 2013 года), для которого я являюсь самообучения, рассмотрим следующий фон:Реализация потока Integer для коэффициентов
Основная идея заключается в работе с производящими функциями вида
a0 + a1 * x + a2 * x^2 + ··· + an * x^n +. , ,
где х это просто «формальный параметр» (то есть, мы никогда не будем заменять какое-либо значения для х, мы просто использовать его в качестве заполнителя), а все коэффициенты а являются целыми числами. Будем хранить коэффициенты a0, a1, a2,. , , в потоке Целое число.
я попытался реализовать x :: Stream Integer
, отметив, что х = 0 + 1x + 0x^2 + 0x^3 +. , , ,
x :: Stream Integer
x = Cons 0 (Cons 1 $ streamRepeat 0)
для следующих определений:
data Stream a = Cons a (Stream a)
streamRepeat :: a -> Stream a
streamRepeat x = Cons x (streamRepeat x)
ли мой x
реализация правильно? Я не уверен, что, учитывая вышеупомянутый фон, я правильно фиксирую коэффициенты a0, a1, ..., an.
Не могли бы вы рассказать больше о совместном использовании? –
@KevinMeredith Вы можете использовать 'Data.Function.fix':' streamRepeat x = fix (Cons x) '. Это позаботится о том, чтобы «связать узел» для вас. Кроме того, вы можете сделать 'streamRepeat x = let x '= Cons xx' в x'', что означает, что хвост вашего потока ссылается обратно на то же место в памяти, что и голова вашего потока, а затем ссылается на то же место в памяти для хвоста, как и исходный хвост. – bheklilr
@KevinMeredith [Я нарисовал картинку] (https://gist.github.com/bheklilr/357c0ac7a0f9f54776d1), чтобы попытаться объяснить, что это делает. В принципе, когда вы определили 'streamRepeat', как это, вы скажете, что определенные значения не просто равны, они буквально одно и то же. Это позволяет компилятору делиться этими значениями и проводить достаточное количество оптимизаций. – bheklilr