2014-10-25 4 views
1

как часть 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.

ответ

3

Да, это правильно. Вы можете немного улучшить определение streamRepeat, добавив общий доступ, но это не должно иметь значения для целей домашней работы.

+0

Не могли бы вы рассказать больше о совместном использовании? –

+2

@KevinMeredith Вы можете использовать 'Data.Function.fix':' streamRepeat x = fix (Cons x) '. Это позаботится о том, чтобы «связать узел» для вас. Кроме того, вы можете сделать 'streamRepeat x = let x '= Cons xx' в x'', что означает, что хвост вашего потока ссылается обратно на то же место в памяти, что и голова вашего потока, а затем ссылается на то же место в памяти для хвоста, как и исходный хвост. – bheklilr

+2

@KevinMeredith [Я нарисовал картинку] (https://gist.github.com/bheklilr/357c0ac7a0f9f54776d1), чтобы попытаться объяснить, что это делает. В принципе, когда вы определили 'streamRepeat', как это, вы скажете, что определенные значения не просто равны, они буквально одно и то же. Это позволяет компилятору делиться этими значениями и проводить достаточное количество оптимизаций. – bheklilr

Смежные вопросы