metaclass: (Default)
[personal profile] metaclass
По мотивам: http://tonsky.livejournal.com/266027.html
Часто ли нужно найти последний элемент последовательности?

Впрочем, я не очень понимаю, причем тут полиморфизм к оптимизации last для векторов - по-моему, другое имя для метода работающего O(1) для конкретной реализации (вектор) вместо O(n) для произвольных последовательностей - это вполне разумная идея.

Рассуждать об производительности алгоритма гораздо проще, зная, что вызов всегда отрабатывает за известное время, а не "в зависимости от того, что за реализацию мы туда передали".
По-моему, очевидно, что не нужно делать обобщенную реализацию, например quicksort, передавая ей абстракцию "последовательность"+"функция получения n-ного элемента", потому что единственный вариант, в котором это работает - мутабельный массив с O(1) для доступа и замены элемента. Соответственно и алгоритмы, использующие last обобщать и надеятся на оптимальную реализацию в некотором роде бессмысленно.

Date: 2012-08-15 10:17 pm (UTC)
From: [identity profile] bydl0coder.livejournal.com
Взять редко, а проверить, последний или нет, постоянно.
В обсуждаемом случае авторы (и автор) просто решили показать, какие они дартаньяны и какой у них белый фрак. Имеют право, хуле.

Date: 2012-08-15 10:36 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Бррр, зачем last для проверки "последний или нет"?
Это совершенно другая функция, next.

Date: 2012-08-15 11:17 pm (UTC)
From: [identity profile] dair-spb.livejournal.com
Вот Айсед меня уже заинтересовал руби с рельсами, так я на них даже написал.
Теперь вот вы с кложурой. Чо на ей писать-то?

Date: 2012-08-15 11:24 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Исполняемые налоговые декларации и кодогенераторы:)

Date: 2012-08-15 11:25 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
пишите водонагреватели

Date: 2012-08-15 11:34 pm (UTC)
From: [identity profile] theiced.livejournal.com
ну как что. какой нить язык описания какого нить ада из которого будет генериться хаскель код который будет генерить фортран, кобол и крестики ;]

Date: 2012-08-16 05:01 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Кстати кложурь в с++ генератор - серьёзный конкурент хаскелю. Ещё бы кто кложурь в си сделал бы.

Date: 2012-08-16 05:56 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Надо попробовать. Гитхаб пока что не пашет правда.

Date: 2012-08-16 06:08 am (UTC)
From: [identity profile] levgem.livejournal.com
мне тоже показалось, что аргументация вида «нехер делать быстро» подходит для того, что бы генерить хаскель. И больше ничего другого нельзя, потому как некошерно.

Date: 2012-08-16 04:59 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Наверное, самым разумным было бы сделать набор методов для класса ISeq с наиболее общими реализациями и явно это выделить в неймспейсах. Для конкретных структур данных сделать свои более эффективные варианты и тоже это явно прописать в документации, а лучше сделать что-то типа классов. То, как это сделано сейчас в кложури, пока что вводит программера в заблуждение: где-то применяется только обобщенная версия, где-то полиморфная, а где-то специфическая. Притом по имени функции понять где что невозможно, да и с сигнатурой метода ненамного легче.
Вот, например: http://clojuredocs.org/clojure_core/1.2.0/clojure.core/last и http://clojuredocs.org/clojure_core/1.2.0/clojure.core/peek. Сигнатуры, как видим, идентичны.

Date: 2012-08-16 06:13 am (UTC)
From: [identity profile] ilya-portnov.livejournal.com
Кто-то вроде предлагал использовать систему типов для контроля сложности. Ну, например, тип Complexity c m a обозначает действие, выполняемое в монаде m со сложностью c, и возвращающее a. Ну и функции, скажем, forM :: SizedList size a -> (a -> Complexity c m b) -> Complexity (size :*: c) m (SizedList size b).

Date: 2012-08-16 11:49 am (UTC)
From: [identity profile] vshabanov.livejournal.com
> Часто ли нужно найти последний элемент последовательности?

Я бы поставил вопрос чуть шире: а нужны ли вообще общие интерфейсы к последовательностям? Зачем last-у работать и со списком и с массивом?

С трудом себе представляю ситуацию, когда вместо списка вдруг потребовался массив или мапка и при этом алгоритм работы не изменился. Т.е. все равно придется перепиливать код и замена last на какой-нить V.last/Map.last не сильно напряжет.

Если же хочется краткости, то уже вылезают проблемы с понятностью кода (везде last, а че делается, с какими структурами данных работаем, непонятно).

В том же самом хаскеле для каждой структуры данных свой отдельный набор ф-ий в отдельном модуле, причем часто с пересекающимися названиями. При этом запросто можно сделать type class с нужными ф-иями и везде писать какой-нить foldl вместо Map.foldl/IntMap.foldl/Text.foldl, но это никому не нужно.

С моей точки зрения всякие обобщенные коллекции/итераторы -- это изврат и переусложнение, возможно вызванное бедностью языков (неудобные/отсутствующие замыкания).

Date: 2012-08-16 12:02 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Именно так, общие интерфейсы не так часто нужны, особенно если речь идет о производительности.

Date: 2012-08-16 12:33 pm (UTC)
From: [identity profile] max630.livejournal.com
> это никому не нужно
конечно не нужно, можно же просто скопипастить модуль, поменять импорт и написать в хаскель-кафе: пакет XXX теперь поддерживает Text. Ищите в XXX.Text и XXX.Text.Lazy

Date: 2012-08-16 01:50 pm (UTC)
From: [identity profile] vshabanov.livejournal.com
Не понял. Какой еще модуль скопипастить? И что значит пакет теперь поддерживает Text?

Date: 2012-08-16 06:35 pm (UTC)
From: [identity profile] max630.livejournal.com
Я хочу сказать, что это работает пока у нас 1 список, который по совместительству строка, 1 Map и 1 Array (для Array впрочем есть класс). А если активно используемых строк - 3 типа, которые требуют явной конвертации, и никакиого общего интерфейса у них нет (если быть точным - есть, но он так далеко в хакадже, что его никто не использует), то любая библиотека работающая сo строками обросла своей копией для каждого из текстов.

При этом различия в реализации этих модулей минимальны, и нет, они не обусловлены тем что там алгоритмы разные.

Date: 2012-08-16 07:39 pm (UTC)
From: [identity profile] vshabanov.livejournal.com
> А если активно используемых строк - 3 типа, которые требуют явной конвертации, и никакиого общего интерфейса у них нет

Общий интерфейс к ним и не нужен, т.к. уж слишком разное у них назначение. С общим интерфейсом/неявными преобразованиями будут проблемы с производительностью и кодировками.

> то любая библиотека работающая сo строками обросла своей копией для каждого из текстов.

А пример можно? Обычно библиотеки либо работают с одним видом строк, либо имеют внутри какой-нить type class и работают со всеми строками одинаково.

Date: 2012-08-16 09:11 pm (UTC)
From: [identity profile] max630.livejournal.com
я это видел в attoparsec

Date: 2012-08-16 09:16 pm (UTC)
From: [identity profile] max630.livejournal.com
собственно, достаточно сравнить исходники Data.Text и Data.Text.Lazy

Date: 2012-08-17 11:44 am (UTC)
From: [identity profile] vshabanov.livejournal.com
Собственно, в этих исходниках можно увидеть кучу RULES, которые врядли будут срабатывать и выдавать такой же эффективный код, если код будет на typeclass-ах.

attoparsec и text -- одни из наиболее скоростных библиотек на хаскеле. Краткость в них принесена в жертву производительности (не думаю, кстати, что можно добиться такой же производительности где бы то ни было с сохранением абстрактных интерфейсов коллекций и итераторов).

Date: 2012-08-16 12:04 pm (UTC)

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 4th, 2025 08:44 am
Powered by Dreamwidth Studios