Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.69.127] |
|
Страницы: (20) [1] 2 3 ... 19 20 все ( Перейти к последнему сообщению ) |
Прикр. сообщ.
#1
,
|
|
|
Задача: Реализация ленивого списка [ленивых объектов]
Цель: сравнение удобства реализации абстракции "ленивый список" средствами указанных языков Термины, определения и обозначения: Требования: Ленивый список должен поддерживать следующие операции: Все операторы не вызывают вычисления еще не вычисленных значений элементов списка. К порождаемым спискам предъявляются все требования, предъявляемые к ленивым спискам. Тестовое задание: <тут должно быть тестовое задание> |
Сообщ.
#1
,
|
|
|
У меня конец рабочего дня, уже туго соображаю. Принимаются пожелания, замечания и уточнения. После полировки ТЗ его обсуждение будет вынесено в отдельную тему, чтобы не мешалось.
Вопросы: 1) Нужно ли создание списка, заданного перечислением значений вида list(1,3,5,7,9,13,19)? Соответственно, появится возможность писать list(1, list(3, 5, 7, 9)) 2) какой примем длину бесконечного списка? Добавлено Можно ввести веса для каждого пункта и оценивать полноту реализации. Можно для пунктов требования ввести вариант-минимум и вариант-максимум с соответствующими оценками. |
Сообщ.
#2
,
|
|
|
Цитата trainer @ 1) Нужно ли создание списка, заданного перечислением значений вида list(1,3,5,7,9,13,19)? Соответственно, появится возможность писать list(1, list(3, 5, 7, 9)) Думаю, да. Должна быть возможность строить такой список на основе других существующих коллекций, поддерживающих перечисление. Цитата trainer @ 2) какой примем длину бесконечного списка? Длина ленивого списка - ленивый объект, вычисляемый в момент обращения. Для бесконечного списка его вычисление уходит в бесконечный цикл ??? Добавлено И раз вынесли в отдельную тему, может не стоит ограничиваться двумя языками ? |
Сообщ.
#3
,
|
|
|
Цитата IL_Agent @ Ну мы можем для себя принять какое-то определенное значение. Скажем -1. Или максимально большое целое. Или индекс последнего(самого дальнего от головы) вычисленного элемента. Или еще что-то.Для бесконечного списка его вычисление уходит в бесконечный цикл ??? Цитата IL_Agent @ Ну если есть такое желание - почему бы и нет. Только чтобы решение было на этом языке и не "из коробки". И раз вынесли в отдельную тему, может не стоит ограничиваться двумя языками ? |
Сообщ.
#4
,
|
|
|
Цитата IL_Agent @ Длина ленивого списка - ленивый объект, вычисляемый в момент обращения. Для бесконечного списка его вычисление уходит в бесконечный цикл? да, если не хранить в структуре списка флаг, указывающий, что список бесконечен. в таком случае перечисленные в задании операторы могут определять с каким списком работают и, например, выдавать ошибку, если вычисление приводит к бесконечному циклу. правда это несколько усложнит реализацию списка. только я думаю это нужно однозначно решить и прописать в ТЗ, делать такое или не делать. Цитата IL_Agent @ И раз вынесли в отдельную тему, может не стоит ограничиваться двумя языками ? я даже не буду предоставлять реализацию на CL, если не попросят =) |
Сообщ.
#5
,
|
|
|
trainer, ну вот ты пишешь задание чисто "под С++". В Delphi некоторые вещи просто излишни. Ладно, напишу я функцию list, а зачем? Почему конструктором список не создавать?
Добавлено Или почему я не могу иметь иерархию объектов-списков типа конечный-бесконечный? |
Сообщ.
#6
,
|
|
|
Цитата trainer @ Ну мы можем для себя принять какое-то определенное значение. Скажем -1. Или максимально большое целое. Или индекс последнего(самого дальнего от головы) вычисленного элемента. Или еще что-то. Проблем в том, как мы узнаем, что список бесконечен ? Например, исходя из предложенных тобой требований, построение списка чисел Фибоначчи мне видится таким (на псевдокоде): fibs = list(0,1) fibs = zip(plus, fibs, tail(fibs)) или fibs = fibs.zip(plus, fibs.tail) И как тут узнать, что у него бесконечная длина ? |
Сообщ.
#7
,
|
|
|
да, кстати, пустой список можно сделать константой (ну если это не будет сложнее в выбранном языке, чем конструктор)
|
Сообщ.
#8
,
|
|
|
Цитата Romkin @ Ладно, напишу я функцию list, а зачем? Почему конструктором список не создавать? Это не принципиально. Главное функционал, а не синтаксис. |
Сообщ.
#9
,
|
|
|
Цитата Romkin @ Все обозначения в ТЗ введены для удобства написания ТЗ и в частности для написания тестового задания. Детали реализации - твое дело. Мне кажется, что в C++ создаваться списки будут посредством соответствующих конструкторов. Ладно, напишу я функцию list, а зачем? Почему конструктором список не создавать? |
Сообщ.
#10
,
|
|
|
Цитата trainer @ 4) Создание списка, заданного начальным и конечным значениями и приращением, обозначается list(elem first_value, elem limit_value, increment). Размер такого списка равен количеству укладывающихся в заданный диапазон значений; Вот этот пункт явно указывает, что список у нас из чисел. А если объекты? Мне хотелось бы разделить реализации списков чисел и списков объектов, в Delphi проблемы с арифметикой на дженериках |
Сообщ.
#11
,
|
|
|
Цитата trainer @ Только чтобы решение было на этом языке и не "из коробки". А я бы и на коробочные решения посмотрел. Для общего развития, так сказать |
Сообщ.
#12
,
|
|
|
Цитата Romkin @ Мне хотелось бы разделить реализации списков чисел и списков объектов, в Delphi проблемы с арифметикой на дженериках Хотя без разницы, вроде бы нормально можно сделать на анонимах, только явные указания действий понадобятся... |
Сообщ.
#13
,
|
|
|
Цитата IL_Agent @ Ну если только вне конкурса. А я бы и на коробочные решения посмотрел. Для общего развития, так сказать Цитата Romkin @ Либо они должны поддерживть приращение, либо для них такой вариант создания неприменим. Не забываем про универсальность решения. Вот этот пункт явно указывает, что список у нас из чисел. А если объекты? |
Сообщ.
#14
,
|
|
|
Цитата Romkin @ Вот этот пункт явно указывает, что список у нас из чисел. А если объекты? Да, пункты 3 и 4 заточены по числа. Видимо, с оглядкой на Хаскелевские [1,3 ..] Предлагаю так: # 3) Создание списка бесконечного размера, заданного начальным значением и функцией приращения, обозначается list(elem, inc(elem):elem ), каждый последующий элемент является значением функции inc от предыдущего. # 4) Создание списка, заданного начальным значениеv, функцией определения конца списка и функцией приращения, обозначается list(elem, is_end(elem):bool, inc(elem):elem). |
Сообщ.
#15
,
|
|
|
Цитата Romkin @ Цитата trainer @ 4) Создание списка, заданного начальным и конечным значениями и приращением, обозначается list(elem first_value, elem limit_value, increment). Размер такого списка равен количеству укладывающихся в заданный диапазон значений; Вот этот пункт явно указывает, что список у нас из чисел. А если объекты? Мне хотелось бы разделить реализации списков чисел и списков объектов, в Delphi проблемы с арифметикой на дженериках смотря какие объекты. в хацкелле таким образом можно использовать любые типы, для которых определён экземпляр класса Enum (по-вашему любые типы, реализующие интерфейс Enum, я так понимаю в С++ это итераторы всякие) Prelude> ['a'..'z'] "abcdefghijklmnopqrstuvwxyz" -- в хаскелле строки -- это списки [Char] Prelude> :info Char data Char = GHC.Types.C# GHC.Prim.Char# -- Defined in GHC.Types ... instance Enum Char -- Defined in GHC.Enum ... Prelude> :info Enum class Enum a where succ :: a -> a pred :: a -> a toEnum :: Int -> a fromEnum :: a -> Int enumFrom :: a -> [a] enumFromThen :: a -> a -> [a] enumFromTo :: a -> a -> [a] enumFromThenTo :: a -> a -> a -> [a] -- Defined in GHC.Enum instance Enum Ordering -- Defined in GHC.Enum instance Enum Int -- Defined in GHC.Enum instance Enum Char -- Defined in GHC.Enum instance Enum Bool -- Defined in GHC.Enum instance Enum () -- Defined in GHC.Enum instance Enum Integer -- Defined in GHC.Num instance Enum Float -- Defined in GHC.Float instance Enum Double -- Defined in GHC.Float Prelude> Добавлено Цитата IL_Agent @ А я бы и на коробочные решения посмотрел. Для общего развития, так сказать ну посмотри на хаскелл =) |