Re[8]: IEnumerable и паттерн матчинг
От: Воронков Василий Россия  
Дата: 20.05.10 17:26
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Для чего? Сохранять надо только нужные для матча данные.


Для того, чтобы стал возможен рекурсивный размор на манер списков.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[4]: IEnumerable и паттерн матчинг
От: Воронков Василий Россия  
Дата: 20.05.10 17:26
Оценка:
Здравствуйте, FDSC, Вы писали:

ВВ>>4. Каким бы странным вам это не показалось, но генераторы (реализацией которых являются итераторы в дотнете) пришли именно из ФЯ

FDS>Если я не ошибаюсь, то там это просто рекурсивный поиск по списку без сохранения состояния, или я что-то не понимаю?

Это вы о чем-то совсем другом.
С помощью генератора можно представить, к примеру, бесконечный список. Т.е. в прямом смысле бесконечный. Генератор — частный случай корутины и неважно как она реализована в конкретном языке, все равно состояние должно быть по определению — т.е. при вызове функции исполнение должно продолжаться с того же момента, на котором оно прервалось.
Итераторы в дотнете — суть классические генераторы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[5]: IEnumerable и паттерн матчинг
От: FDSC Россия consp11.github.io блог
Дата: 20.05.10 17:45
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, FDSC, Вы писали:


ВВ>>>4. Каким бы странным вам это не показалось, но генераторы (реализацией которых являются итераторы в дотнете) пришли именно из ФЯ

FDS>>Если я не ошибаюсь, то там это просто рекурсивный поиск по списку без сохранения состояния, или я что-то не понимаю?

ВВ>Это вы о чем-то совсем другом.

ВВ>С помощью генератора можно представить, к примеру, бесконечный список. Т.е. в прямом смысле бесконечный. Генератор — частный случай корутины и неважно как она реализована в конкретном языке, все равно состояние должно быть по определению — т.е. при вызове функции исполнение должно продолжаться с того же момента, на котором оно прервалось.
ВВ>Итераторы в дотнете — суть классические генераторы.

Стоп-стоп-стоп. Разве генератор в ФЯ не принимает как раз положение в списке?
Т.е., грубо говоря, если у меня есть бесконечный список, он ведь не запоминает в себе, на каком месте он остановился, он ведь принимает или номер, или элемент списка, разве нет?
Re[6]: IEnumerable и паттерн матчинг
От: Воронков Василий Россия  
Дата: 20.05.10 17:50
Оценка: +1
Здравствуйте, FDSC, Вы писали:

FDS>Стоп-стоп-стоп. Разве генератор в ФЯ не принимает как раз положение в списке?

FDS>Т.е., грубо говоря, если у меня есть бесконечный список, он ведь не запоминает в себе, на каком месте он остановился, он ведь принимает или номер, или элемент списка, разве нет?

Генератор — это генератор. Списки тут не причем. Причем тут вообще номер или элемент списка? Вы вообще представляете как итераторы в дотнете работают? А дотнетовские итераторы — это классический пример генераторов. С помощью генераторов (ну шире — корутин) можно, к примеру, реализовать кооперативную многопоточность.

Генератор — это функция, которую можно вызывать несколько раз, и она продолжается с того момента, на котором выполнение было прервано. Не просто продолжается с того же момента, но восстанавливает все свое состояние (значение локальных переменных) и пр.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[7]: IEnumerable и паттерн матчинг
От: FDSC Россия consp11.github.io блог
Дата: 20.05.10 18:53
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Генератор — это функция, которую можно вызывать несколько раз, и она продолжается с того момента, на котором выполнение было прервано. Не просто продолжается с того же момента, но восстанавливает все свое состояние (значение локальных переменных) и пр.


Стоп. Я думал, что вот это генератор

(define (fibgen a b)
(cons-stream a (fibgen b (+ a b))))
(define fibs (fibgen 0 1))


Нет?

Если нет, тогда каким образом вообще генератор может быть реализован в ФЯ?
В SICP такого слова как "генератор" вообще, вроде бы, нет.
Re[8]: IEnumerable и паттерн матчинг
От: Воронков Василий Россия  
Дата: 20.05.10 19:17
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Стоп. Я думал, что вот это генератор

FDS>
FDS>(define (fibgen a b)
FDS>(cons-stream a (fibgen b (+ a b))))
FDS>(define fibs (fibgen 0 1))
FDS>

FDS>Нет?

Это не генератор.

FDS>Если нет, тогда каким образом вообще генератор может быть реализован в ФЯ?

FDS>В SICP такого слова как "генератор" вообще, вроде бы, нет.

Например, через замыкания.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[9]: IEnumerable и паттерн матчинг
От: FDSC Россия consp11.github.io блог
Дата: 20.05.10 20:20
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Здравствуйте, FDSC, Вы писали:


FDS>>Стоп. Я думал, что вот это генератор

FDS>>
FDS>>(define (fibgen a b)
FDS>>(cons-stream a (fibgen b (+ a b))))
FDS>>(define fibs (fibgen 0 1))
FDS>>

FDS>>Нет?

ВВ>Это не генератор.


FDS>>Если нет, тогда каким образом вообще генератор может быть реализован в ФЯ?

FDS>>В SICP такого слова как "генератор" вообще, вроде бы, нет.

ВВ>Например, через замыкания.


Что именно через замыкания? Вверху тоже замыкание есть.
Re[3]: IEnumerable и паттерн матчинг
От: Воронков Василий Россия  
Дата: 20.05.10 20:28
Оценка:
Здравствуйте, Аноним, Вы писали:

C>>Самый примитивный способ, до которого я додумался, это Seq(head, tail) и Seq() (ну, или IEnumerable(head, tail) и IEnumerable).

А>Но в душе хочется F-шарповских Active Patterns, только покруче.

Например? Чем покруче?
Re[10]: IEnumerable и паттерн матчинг
От: Воронков Василий Россия  
Дата: 20.05.10 20:42
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Что именно через замыкания?


Термин generator достаточно распространен. Погугли на, скажем, generators in Scheme — наверняка найдешь несколько примеров реализации этого дела на макросах.
Re[11]: IEnumerable и паттерн матчинг
От: FDSC Россия consp11.github.io блог
Дата: 20.05.10 21:22
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Термин generator достаточно распространен. Погугли на, скажем, generators in Scheme — наверняка найдешь несколько примеров реализации этого дела на макросах.


Что-то не гуглится. Есть только генераторы кода, генераторы цветовых схем, кварцевые генераторы и т.д.
Re[12]: IEnumerable и паттерн матчинг
От: Воронков Василий Россия  
Дата: 20.05.10 21:37
Оценка: 2 (1)
Здравствуйте, FDSC, Вы писали:

FDS>Здравствуйте, Воронков Василий, Вы писали:


ВВ>>Термин generator достаточно распространен. Погугли на, скажем, generators in Scheme — наверняка найдешь несколько примеров реализации этого дела на макросах.


FDS>Что-то не гуглится. Есть только генераторы кода, генераторы цветовых схем, кварцевые генераторы и т.д.


Например, здесь или здесь.
Re[4]: IEnumerable и паттерн матчинг
От: achp  
Дата: 21.05.10 14:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Тут целая квантовая теория выходит Чтобы прочитать енумератор, надо изменить его состояние. От этого печального факта никуда не денешся.


Я тут делал маленькие развлечения на Эф-шарпе и ничего лучше не смог придумать как складывать уже прочитанную часть перечисления в списке. При этом есть ещё такая проблема как возможность гонок. В итоге в общем виде сопоставление перечислений оказывается не очень эффективной вещью.
Re[5]: IEnumerable и паттерн матчинг
От: hardcase Пират http://nemerle.org
Дата: 21.05.10 15:16
Оценка: 9 (1)
Здравствуйте, achp, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Тут целая квантовая теория выходит Чтобы прочитать енумератор, надо изменить его состояние. От этого печального факта никуда не денешся.


A>Я тут делал маленькие развлечения на Эф-шарпе и ничего лучше не смог придумать как складывать уже прочитанную часть перечисления в списке. При этом есть ещё такая проблема как возможность гонок. В итоге в общем виде сопоставление перечислений оказывается не очень эффективной вещью.




В принципе можно сделать немного иначе. Ввести в язык новый тип списков — lazy_list. Один из конструкторов такого списка может принимать на вход IEnumerable. Сопоставление производить аналогично list.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: IEnumerable и паттерн матчинг
От: achp  
Дата: 21.05.10 15:21
Оценка:
Здравствуйте, hardcase, Вы писали:

H>В принципе можно сделать немного иначе. Ввести в язык новый тип списков — lazy_list. Один из конструкторов такого списка может принимать на вход IEnumerable. Сопоставление производить аналогично list.


Так я что-то подобное и делал. Единственное, в чём разница, — в Эф-шарпе тип 'a seq соответствует уже IEnumerator. С точки зрения проблем реализации, шаг, отделяющий IEnumerable от IEnumerator, несуществен.
Re: IEnumerable и паттерн матчинг
От: FR  
Дата: 21.05.10 18:59
Оценка: 9 (1)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Помнится, как-то затрагивалась тема касательно того, что неплохо было бы добавить специальный образец для Enumerable. Вот, собственно, интересно — как бы мог выглядеть этот образец (предполагается, что будет возможен "рекурсивный" разбор на манер списка с образцом голова-хвост x::xs). Т.е. синтаксис, поведение?


В OCaml есть паттерн матчинг потоков (streams) описание тут:

http://shamil.free.fr/comp/ocaml/html/book004.html#htoc62
http://shamil.free.fr/comp/ocaml/html/book013.html#htoc170

http://www.ffconsultancy.com/ocaml/benefits/parsing.html

Кратко сопоставление уничтожающее, то есть если образец совпадает то он убирается из потока, кроме того
можно рекурсивно вызывать для остатка потока функцию разбора, вот небольшой пример фильтрует символьный
поток оставляя в нем только цифры:

let digit c = c>='0' && c<='9'

let rec tst = parser 
    | [< 'c when digit c; r=tst >] -> (String.make 1 c) ^ r
    | [<'x; r=tst>] -> r;
    | [<>] -> ""
Re[2]: IEnumerable и паттерн матчинг
От: FR  
Дата: 21.05.10 19:07
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Спор ни о чём: пытаетесь нефункциональщину запихнуть в функциональный язык.


Для строгих (энергичных) функциональных языков это норма жизни
То есть некий объект сохраняющий и изменяющий свое состояние и вокруг него
функциональная обвязка, как пример те же потоки и ленивые списки в OCaml,
или наиболее ярко енумераторы в окамловских батарейках (батарейки это библиотека
претендующая на замену стандартной, аналог буста из C++) http://thelema.github.com/AAA-batteries/hdoc/BatEnum.html
Re[6]: IEnumerable и паттерн матчинг
От: i1yich  
Дата: 24.05.10 00:33
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Зачем клонировать? Мы матчим IEnumerable. Для каждого матча можно вызвать GetEnumerator().


А если под IEnumerable скрывается запрос в БД? Получится по одному запросу на матч.
Нужно обязательно мемоизовывать исходную последовательность. Это решит проблему и с повторяемостью, и позволит перечислять источник только один раз.
При этом заматченный хвост tail и сам матч m целиком
| seq(1, 2, tail) as m
будут возвращаться уже из мемоизованного источника.
Re[7]: IEnumerable и паттерн матчинг
От: Ziaw Россия  
Дата: 24.05.10 06:08
Оценка:
Здравствуйте, i1yich, Вы писали:

Z>>Зачем клонировать? Мы матчим IEnumerable. Для каждого матча можно вызвать GetEnumerator().


I>А если под IEnumerable скрывается запрос в БД? Получится по одному запросу на матч.


I>Нужно обязательно мемоизовывать исходную последовательность. Это решит проблему и с повторяемостью, и позволит перечислять источник только один раз.

I>При этом заматченный хвост tail и сам матч m целиком
| seq(1, 2, tail) as m
будут возвращаться уже из мемоизованного источника.


Я думал над этим. Мемоизовывать можно, только лениво, на каждом матче. Только c синтаксисом непонятно, как здесь различить любой остаток и последний элемент?
Re[8]: IEnumerable и паттерн матчинг
От: catbert  
Дата: 24.05.10 09:00
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Только c синтаксисом непонятно, как здесь различить любой остаток и последний элемент?


Это несложно:

| seq(1, 2 .. tail) as m => ...
или в стиле Пролога
| seq(1, 2 | tail) as m => ...


или всегда считать последний элемент хвостом:

| seq(1, 2, last, ()) as m => ... // хвост пуст
| seq(1, 2, tail) as m => ... // хвост — tail


Мне непонятно, зачем "as m".

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

Мне нравится, как сделано в OCaml'е: http://rsdn.ru/forum/nemerle/3816583.1.aspx
Автор: FR
Дата: 21.05.10
Re[7]: IEnumerable и паттерн матчинг
От: dsorokin Россия  
Дата: 24.05.10 14:06
Оценка:
Здравствуйте, achp, Вы писали:

A>Так я что-то подобное и делал. Единственное, в чём разница, — в Эф-шарпе тип 'a seq соответствует уже IEnumerator. С точки зрения проблем реализации, шаг, отделяющий IEnumerable от IEnumerator, несуществен.


Это уже есть. LazyList из FSharpPowerPack. Фактически, это поток. Превращается seq в поток достаточно просто:

module LazyList =

    /// Build a new collection from the given enumerable object
    val ofSeq: seq<'T> -> LazyList<'T>


Для потока определен активный паттерн-матчинг:

    val (|Cons|Nil|) : LazyList<'T> -> Choice<('T * LazyList<'T>),unit>


Поток так устроен, что там уже ничего не перевычисляется.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.