Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2014, 17:21   #131
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
подожди, у нас есть некая фигня, в которую мы можем класть сообщения и они там накапливаются, а можем забирать и они оттуда пропадают. С чего бы эта штука не грязная.
Во первых ничего нигде не копится! Вот вам очередь из 2-х последовательных действий(сообщений), где последовательность достигается за счет связывания по параметрам, в другом контексте это можно назвать блокировкой потоков ввода.
Код:
get2chars i0 = [a,b]  where (a,i1) = getchar i0
                            (b,i2) = getchar i1
Само собой getchar это не читая фунцкция(ведь она даже не детерминированная), если у нее нет аргументов, но ее можно замаскировать под чистую, так что и комар носа не подточит.
Цитата:
Буквально вчера написал для работы на C# утилитку, которая читает строки из одного файла, удаляет дубликаты, сортирует и пишет в другой файл. Причём делает это оптимальным образом. Весь код - одна строка:
Парадокс в последнее время у меня заключается в том, что чем сильнее я хочу что-то автоматизировать тем больше скатываюсь в функциональные вещи. Т.е. сам того не подозревая реализовал поведение некоторых стандартных монад и функций высшего порядка(с помощью классов естественно), назвал это своими именами, т.к. тогда и в помине об этом не знал. Объекты в ООП языках могут выступать как функции, интерфейсы как классы типов и т.д. То есть можно легко провести аналогии, но большинство императивных языков позволяют слишком много, чтобы потом компилятор мог сам проанализировать код и в отношении той же модели акторов сразу(взаимоблокировки, ссылающиеся друг на друга ссылки и т.д.), еще на момент компиляции(при заданных начальных параметров) сказать, куда сообщения никогда не попадут, где они будут копится вечно и т.д. Конечно все это еще далекое будущее, хотя в теории уже существует лет 30-40.

Т.е. если уж и разрабатывать новый язык программирования, то нужно все строить на том, чтобы можно было еще на этапе компиляции сказать о проблемах. Чтобы можно было подсунуть анализатору несколько схем программ делающих одно и тоже, а компилятор бы сказал, какая из них лучше и вообще, делают ли они одно и тоже или нет. И т.д.

Код:
File.WriteAllLines("output.tsv", new SortedSet(File.ReadLines("input.txt")));
Получает строку, разбивает на слова, сортирует и выводит на экран:
Код:
sort . words <$> getLine >>= print
Или такой вариан:
Код:
sort . lines <$> readFile "input.txt" >>= writeFile "out.txt" . unlines
Читает файл, разбивает на строки, сортирует, соединяет и пишет в файл. Если нужно ленивое и хорошее решение, то придется описать свои функции(O(N log N)), хотя возможно уже есть готовые) которые работают сразу со списками:
Код:
rmdups <$> readFileLines "input.txt" >>= writeFileLines "out.txt"
Тогда если бы не было сортировки, то чтение из файла строки, эта строка стразу бы проверялась на дубликат и писалась бы в файл, что-то вроде переливания воды из одного стакана в другой через фильтр, при этом сам фильтр модифицируется и не пропускает то что уже прошло =).

_____
Да, есть готовые функции в Data.Set работающие за O(N log N), List -> Set, и O(N) Set -> List

Последний раз редактировалось Kostia; 31.01.2014 в 01:23.
Kostia вне форума Ответить с цитированием
Старый 31.01.2014, 08:14   #132
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Kostia
Цитата:
Во первых ничего нигде не копится!
http://my.safaribooksonline.com/book...essage_passing

Each Erlang process has a mailbox in which incoming messages are stored. When a message is sent, it is copied from the sending process into the recipient’s mailbox for retrieval. Messages are stored in the mailbox in the order in which they are delivered.

Копятся. И это банальная грязная очередь навроде MSMQ.
the_deer_one вне форума Ответить с цитированием
Старый 31.01.2014, 09:34   #133
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Копятся. И это банальная грязная очередь навроде MSMQ.
Да что же вы прикопались к очереди. Если я пишу 'a':str, это значит, что str остается прежним, а новый элемент 'a', прицепляется сзади. Тут ничего не нарушается и все по канонам фп. Но даже если бы было str:['a'], то str при каждом присоединении к нему в конце нового элемента полностью пересоздавался, из-за того, что нужно изменить последний элемент списка, т.е. сделать так, чтобы он ссылался на новый.
Да и Erlang не является чистым функциональным языком, он просто функциональный. Но в отношении системы сообщений там все гладко.
Вот тоже самое, но на Хаскеле. Эту ссылку уже приводил.
Kostia вне форума Ответить с цитированием
Старый 31.01.2014, 12:59   #134
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Kostia какая то у тебя неправильная иммутабельность.
Код:
var list = new List<string>();
list.Add("a");
всё нормально, list у нас прежний, новый элемент прицепился сзади. Вау в с# иммутабельные коллекции!
the_deer_one вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопросик самым опытным :-) Doholyan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 25.08.2009 17:13
Проблема с синтаксисом? Geddar PHP 1 30.06.2008 16:44
Казус с синтаксисом???... Sota Общие вопросы C/C++ 6 17.07.2007 19:15