Re[35]: Проблемы организации OR-мапинга
От: EvilChild Ниоткуда  
Дата: 27.04.09 20:06
Оценка:
Здравствуйте, VladD2, Вы писали:

EC>>В F# сделано аналогично, но это артефакт реализации, такие типы компилятор помечет атрибутом CompilationMapping(SourceConstructFlags.SumType), чтобы отличать их от обычных.

EC>>Сделано так, думаю, исключительно исходя из простоты реализации, а не потому, что нам для реализации ПМ нужны динамические приведения типа.
EC>>В OCaml или Haskell уверен сделано совсем иначе.

VD>А я уверен в обратно. Тип определяет то, что можно сделать с его экземпляром. В рантайме мы можем получить разные экземпляры разных типов. Стало быть не зная того, что за тип имеется в наличии нельзя с ним работать.

По поводу выделенного.
Есть определение:
type expr = Plus of expr * expr
        | Minus of expr * expr
        | Times of expr * expr
        | Divide of expr * expr
        | Value of string
        ;;

и выражение:
let rec to_string e =
  match e with
    Plus (left, right)   -> "(" ^ (to_string left) ^ " + " ^ (to_string right) ^ ")"
  | Minus (left, right)  -> "(" ^ (to_string left) ^ " - " ^ (to_string right) ^ ")"
  | Times (left, right)  -> "(" ^ (to_string left) ^ " * " ^ (to_string right) ^ ")"
  | Divide (left, right) -> "(" ^ (to_string left) ^ " / " ^ (to_string right) ^ ")"
  | Value v -> v
  ;;

У меня к тебе 2 вопроса:
1. сколько здесть опеделено алгебраических типов данных?
2. где здесь разные экземпляры разных типов?

По мне так здесть все типы известны статически и необходимости в динамическом приведении типа нет совсем.
now playing: The Future Sound Of London — Globular (Longform)
Re[32]: Проблемы организации OR-мапинга
От: vdimas Россия  
Дата: 28.04.09 00:38
Оценка:
Здравствуйте, EvilChild, Вы писали:

V>>В месте определения/сопоставления дискриминатора алгебраического типа. Для того же Nemerle — это динамическая проверка типа.


EC>Так происходит исключительно потому, что алгебраические типы замапили на классы, которые уже есть у нас нахаляву в CLR.

EC>С точки зрения системы типов приведений нет — это деталь реализации.

В твоем хаскеле точно такая же деталь: динамически проверяется дискриминатор объединения, который определяет тип содержащегося в нем значения. Для CLR дискриминатором выступает хендл типа, как говорится — найдите отличия.

Динамическое приведение типа — суть рантайм тест значения на соответствие типу. Отличие в CLR лишь в том, что в этой ОО-платформе можно приводить так же к базовому типу или интерфейсу.
Re[33]: Проблемы организации OR-мапинга
От: EvilChild Ниоткуда  
Дата: 28.04.09 04:19
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>В месте определения/сопоставления дискриминатора алгебраического типа. Для того же Nemerle — это динамическая проверка типа.


EC>>Так происходит исключительно потому, что алгебраические типы замапили на классы, которые уже есть у нас нахаляву в CLR.

EC>>С точки зрения системы типов приведений нет — это деталь реализации.

V>В твоем хаскеле точно такая же деталь: динамически проверяется дискриминатор объединения, который определяет тип содержащегося в нем значения. Для CLR дискриминатором выступает хендл типа, как говорится — найдите отличия.


V>Динамическое приведение типа — суть рантайм тест значения на соответствие типу. Отличие в CLR лишь в том, что в этой ОО-платформе можно приводить так же к базовому типу или интерфейсу.


Зачем выполнять рантайм тест значения на соответствие типу, если тип известен на этапе компиляции?
Вот есть у тебя тип
data Maybe a = Nothing | Just a

в функцию приходит значение этого типа и мы по нему матчимся.
Nothing и Just a имеют один и тот же тип и это известно на этапе компиляции.
Мы матчимся по разным значениям одного типа.
now playing: Andreas Henneberg — Whos Pedo Bear
Re[62]: Проблемы организации OR-мапинга
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.04.09 05:22
Оценка:
Здравствуйте, adontz, Вы писали:
A>Той которую видишь. Зайди на сайт RSDN.ru, открой в дереве слева список форумов, щёлкни на форуме, шёлкни вверху на сообщении в форуме. Сверху будет адрес — rsdn.ru. Это про фреймы. Про AJAX — в GoogleMaps, аналогичная ситуация. Прокручиваешь карту, масштабируешь, а адрес не меняется.
Рома, сходи на wikimapia.org.

A>Более предметно, практически все до кого дошёл прогресс ходят с покетами. То есть ты конечно можешь смотреть в окно на красивые, не тронутые человеком, пейзажи Мухосранска, но с покетами сейчас ходят представители практически всех родов деятельности: менеджеры, почтальоны, официанты, полицейские, лекторы, студенты и т.д. Если этого где-то ещё нет, то это вопрос отставания от прогресса, а не отсутствия необходимости.

И? Какие проблемы с интернетом у пользователей покетов?

A>ЛОЛ. Вообще-то тут обсуждалась необходимость постоянного соединения, а не локальной реплики. Надо не только писать, но и читать иногда.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[68]: Проблемы организации OR-мапинга
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.04.09 05:40
Оценка:
Здравствуйте, adontz, Вы писали:

A>Не говори глупости, если не разбираешься в предметной области.

Рома, ну правда — вы такие одни уникальные. Никто больше тем, о чем ты рассказываешь, не заморачивается.


A>Объясняю ещё раз на пальцах. Агент пришёл к клиенту с покетом продать товар. Утром себестоимость была 10, днём, когда агент пришёл к клиету — 11.

Это каким таким образом себестоимость поменялась задним числом?
A>После начисления всех скидок конечная цена стала 10.5. Компании выгоднее продать по 11 оформив 0 прибыли, чем продать по 10.5 и заплатить налог за продажу ниже себестоимости.
Да ладно?
А по-моему выгоднее подкрутить себестоимость нужным образом в конце отчетного периода.

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

Потому, Рома, что такого примера в природе не бывает. У тебя всё — прямо фильмы Кустурицы.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[34]: Проблемы организации OR-мапинга
От: vdimas Россия  
Дата: 28.04.09 06:51
Оценка:
Здравствуйте, EvilChild, Вы писали:

EC>Зачем выполнять рантайм тест значения на соответствие типу, если тип известен на этапе компиляции?


Не известен по определению (определению алгебраических типов). Хотя нет, будет известен достоверно, если в алгебраическую группу входит всего 1 тип.

EC>Вот есть у тебя тип

EC>
EC>data Maybe a = Nothing | Just a
EC>

EC>в функцию приходит значение этого типа и мы по нему матчимся.
EC>Мы матчимся по разным значениям одного типа.

В функцию приходит значение размеченного объединения, которое суть пара: разметка + значение соответсвующего разметке типа. Объекты CLR представлены в куче аналогично, кстати. И насчёт "одного типа"... в случае алгебраических типов мы имеем 2 типа минимум: тип группы и хоть один тип участника группы.

------------
Не хочешь посмотреть на описание размеченных объединений в CORBA IDL и заодно посмотреть, что генерируют компиляторы на эти описания? А потом мы возьмем эти 3 примера: IDL, CLR и Хаскель, и посмотрим, что там происходит в процессе динамического определения типа.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[35]: Проблемы организации OR-мапинга
От: EvilChild Ниоткуда  
Дата: 28.04.09 07:25
Оценка:
Здравствуйте, vdimas, Вы писали:

EC>>Мы матчимся по разным значениям одного типа.


V>В функцию приходит значение размеченного объединения, которое суть пара: разметка + значение соответсвующего разметке типа. Объекты CLR представлены в куче аналогично, кстати. И насчёт "одного типа"... в случае алгебраических типов мы имеем 2 типа минимум: тип группы и хоть один тип участника группы.


Объясни мне тогда поведение GHCi:

*Main> :i MyNum
data MyNum = One | Two
*Main> :t One
One :: MyNum
*Main> :t Two
Two :: MyNum



V>Не хочешь посмотреть на описание размеченных объединений в CORBA IDL и заодно посмотреть, что генерируют компиляторы на эти описания? А потом мы возьмем эти 3 примера: IDL, CLR и Хаскель, и посмотрим, что там происходит в процессе динамического определения типа.

Хочу посмотреть, покажи.
Re[63]: Проблемы организации OR-мапинга
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.04.09 09:02
Оценка:
Здравствуйте, Sinclair, Вы писали:

A>>Более предметно, практически все до кого дошёл прогресс ходят с покетами. То есть ты конечно можешь смотреть в окно на красивые, не тронутые человеком, пейзажи Мухосранска, но с покетами сейчас ходят представители практически всех родов деятельности: менеджеры, почтальоны, официанты, полицейские, лекторы, студенты и т.д. Если этого где-то ещё нет, то это вопрос отставания от прогресса, а не отсутствия необходимости.

S>И? Какие проблемы с интернетом у пользователей покетов?

Нестабильность соединения.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[69]: Проблемы организации OR-мапинга
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.04.09 09:06
Оценка:
Здравствуйте, Sinclair, Вы писали:

A>>Объясняю ещё раз на пальцах. Агент пришёл к клиенту с покетом продать товар. Утром себестоимость была 10, днём, когда агент пришёл к клиету — 11.

S>Это каким таким образом себестоимость поменялась задним числом?

В 9:00 агент сделал синхронизацию в офисе и выехал на маршрут, в 10:00 приехала партия товара по более высокой цене, чем раньше , в 11:00 агент входит к клиенту.

A>>После начисления всех скидок конечная цена стала 10.5. Компании выгоднее продать по 11 оформив 0 прибыли, чем продать по 10.5 и заплатить налог за продажу ниже себестоимости.

S>А по-моему выгоднее подкрутить себестоимость нужным образом в конце отчетного периода.

Это называется финансовая махинация.

S>Потому, Рома, что такого примера в природе не бывает. У тебя всё — прямо фильмы Кустурицы.


Антон это, во-первых, реальная ситуация, а, во-вторых, она произошла не у меня. Уж как-нибудь смирись с этим.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[70]: Проблемы организации OR-мапинга
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.04.09 09:28
Оценка:
Здравствуйте, adontz, Вы писали:

A>В 9:00 агент сделал синхронизацию в офисе и выехал на маршрут, в 10:00 приехала партия товара по более высокой цене, чем раньше , в 11:00 агент входит к клиенту.

Ой, как интересно. А вы себестоимость по какой модели учитываете — FIFO, LIFO, средневзвешенной или как?
Это вопрос номер один.
Вопрос номер два: сколько раз в день может измениться цена на товар?

Ну, то есть все конечно понимают, что у вас там есть особенности ценообразования, но вообще говоря всем на них накласть. Если ты по телефону предложил клиенту по 5 за штуку, а через час приехал для подписания и сказал "ой, у нас теперь цена 5.21 за штуку", тебя пошлют на все четыре стороны. Это не биржа. Оффер должен иметь ненулевой validity period.

Еще интереснее, как здесь поможет локальная реплика. В случае тонкого клиента агент отправит заказ через сервер, и тот проапдейтит цены автоматически.

A>Это называется финансовая махинация.

Ничего подобного. Это называется "оптимизация налогообложения", и ничего с ней сделать нельзя.

A>Антон это, во-первых, реальная ситуация, а, во-вторых, она произошла не у меня. Уж как-нибудь смирись с этим.

Да мне-то всё равно, Рома. Возможно, ситуация и выглядела похожим образом. Но технические выводы ты сделал из нее явно поспешно.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[71]: Проблемы организации OR-мапинга
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.04.09 09:39
Оценка:
Здравствуйте, Sinclair, Вы писали:

A>>В 9:00 агент сделал синхронизацию в офисе и выехал на маршрут, в 10:00 приехала партия товара по более высокой цене, чем раньше , в 11:00 агент входит к клиенту.

S>Ой, как интересно. А вы себестоимость по какой модели учитываете — FIFO, LIFO, средневзвешенной или как?

Налоговая требует партионный учёт, так что FIFO ил LIFO. На практике FIFO. Средневзвешенная система тоже используется для анализа.

S>Вопрос номер два: сколько раз в день может измениться цена на товар?


Базовая цена меняется редко. Конечная цена на товар для конкретного клиента вполне может поменяться в течение дня.

S>Ну, то есть все конечно понимают, что у вас там есть особенности ценообразования, но вообще говоря всем на них накласть. Если ты по телефону предложил клиенту по 5 за штуку, а через час приехал для подписания и сказал "ой, у нас теперь цена 5.21 за штуку", тебя пошлют на все четыре стороны. Это не биржа. Оффер должен иметь ненулевой validity period.


Базовая цена может расти, но её не меняют в середине рабочего дня. Набор скидок применяемых к конкретному клиенту меняют, но агенту не сложно объяснить клиенту почему это произошло. Цена при этом обычно падает.

S>Еще интереснее, как здесь поможет локальная реплика. В случае тонкого клиента агент отправит заказ через сервер, и тот проапдейтит цены автоматически.


В данной ветке обсуждалась не реплика.

A>>Это называется финансовая махинация.

S>Ничего подобного. Это называется "оптимизация налогообложения", и ничего с ней сделать нельзя.

Плати штрафы за такую "оптимизацию"
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[72]: Проблемы организации OR-мапинга
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.04.09 10:20
Оценка:
Здравствуйте, adontz, Вы писали:

A>Налоговая требует партионный учёт, так что FIFO ил LIFO. На практике FIFO. Средневзвешенная система тоже используется для анализа.

Ну, мы же не про анализ говорим, а про ценообразование. Так? Далее, если FIFO, то сценарий, о котором ты рассказываешь, произойти никак не может. С утра на складе было 100шт по 10 рублей. Ты приехал продавать 80, тут поступили еще 100 по цене 20 рублей — цена никак не станет 15 рублей. Никакое налогообложение этого не потребует — это бред.

A>Базовая цена меняется редко. Конечная цена на товар для конкретного клиента вполне может поменяться в течение дня.

Что такое "базовая цена"? Клиенту всё равно, что у вас там называется "базовой" ценой, а что — сборами аэропорта. Для него важна только конечная цена, и совершенно непонятно, почему он должен разбираться в тонкостях ваших поставок.

A>Базовая цена может расти, но её не меняют в середине рабочего дня.

A>Набор скидок применяемых к конкретному клиенту меняют, но агенту не сложно объяснить клиенту почему это произошло. Цена при этом обычно падает.
Ты сам себе противоречишь. Только что ты рассказывал про то, что

Агент пришёл к клиенту с покетом продать товар. Утром себестоимость была 10, днём, когда агент пришёл к клиету — 11. После начисления всех скидок конечная цена стала 10.5. Компании выгоднее продать по 11 оформив 0 прибыли, чем продать по 10.5 и заплатить налог за продажу ниже себестоимости.

Твой пример? Где тут "базовая", и где "конечная"? Где тут "обычно падает"? Зачем знать себестоимость днём?

A>Плати штрафы за такую "оптимизацию"

Какие штрафы? За что именно? Рома, ты так загибаешь пальцы про свой опыт в учетных системах, что мне странно читать такие высказывания. Бухгалтерия по природе своей никогда не работает в реальном времени. Она всегда работает задним числом. Есть зарегулированные отрасли, как, к примеру, фармацевтика — и у нас вполне реально купить в аптеке две коробки одного и того же лекарства по разной цене — потому что у них жестко ограничены наценки, и себестоимость полностью определяет цену.
Но во всех остальных случаях рулит простое ценообразование, где цена является предметом соглашения сторон, а не результатом какой-то формулы.
Более того, документы оформляются более-менее задним числом, чтобы получить хоть какую-то целостность.
Потому, в частности, что многие компании торгуют с отсрочкой платежа, и у товара на складе вообще нет себестоимости даже после того, как он продал. Какие нахрен тут формулы, если ты продал товар в июне, а рассчитываешься за него в августе, по цене, которую его хозяин определил только в июле?
Поэтому бухгалтерская себестоимость возникает только в момент подготовки квартальной отчетности. И тут у бухгалтерии есть масса способов подогнать результаты к требуемым, оставаясь на все 100% в рамках закона.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[72]: Проблемы организации OR-мапинга
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.04.09 11:44
Оценка: +1
Здравствуйте, adontz, Вы писали:

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


A>>>В 9:00 агент сделал синхронизацию в офисе и выехал на маршрут, в 10:00 приехала партия товара по более высокой цене, чем раньше , в 11:00 агент входит к клиенту.

S>>Ой, как интересно. А вы себестоимость по какой модели учитываете — FIFO, LIFO, средневзвешенной или как?

A>Налоговая требует партионный учёт, так что FIFO ил LIFO. На практике FIFO. Средневзвешенная система тоже используется для анализа.

Давно не работал с бух учетом, но политика списания себестоимости прописвывается для фирмы (требовать можно только то что прописано в Учетной политике торговой организации).
Подгон вполне возможен. Например в рознице, где не ведется (или ведется, но для себя) потоварная продажа, а в конце месяца на основании инвентаризации создается один документ продаж, равный сумме выручки за месяц.
Так как возможно множество пересортиц итд. Главное, что бы предприятие работало с общей прибылью. Но могу конечно и ошибаться, основываясь на старом опыте.
Аналогично поступают и с возвратами, редактируя задним числом оптовую отгрузку итд. Вариантов много. Главное соответствовать требованиям налоговой и встречным проверкам.
и солнце б утром не вставало, когда бы не было меня
Re[36]: Проблемы организации OR-мапинга
От: vdimas Россия  
Дата: 28.04.09 12:43
Оценка: 2 (1)
Здравствуйте, EvilChild, Вы писали:

V>>В функцию приходит значение размеченного объединения, которое суть пара: разметка + значение соответсвующего разметке типа. Объекты CLR представлены в куче аналогично, кстати. И насчёт "одного типа"... в случае алгебраических типов мы имеем 2 типа минимум: тип группы и хоть один тип участника группы.


EC>Объясни мне тогда поведение GHCi:


EC>

EC>*Main> :i MyNum
EC>data MyNum = One | Two
EC>*Main> :t One
EC>One :: MyNum
EC>*Main> :t Two
EC>Two :: MyNum


Для полноты картины надо было еще матчинг привести. В Хаскеле синтаксис минималистический — конструктор алгебраического типа выглядит так же как упоминание соотв. значения дискриминатора.

В этом примере One, Two — конструкторы алгебраического типа. Каждый из них конструирует обобщенный тип MyNum, заворачивая в него пустой тупл. Случай вырожденный, размеченное объединение для всех своих значений состоит из собс-но кода разметки и ничего более, т.е. такое использование близко к enum из C++ или C#.


V>>Не хочешь посмотреть на описание размеченных объединений в CORBA IDL и заодно посмотреть, что генерируют компиляторы на эти описания? А потом мы возьмем эти 3 примера: IDL, CLR и Хаскель, и посмотрим, что там происходит в процессе динамического определения типа.

EC>Хочу посмотреть, покажи.

Я предлагал тебе самому, но ладно.

Отрывок из произведений прошлых лет (IDL):
  enum ScriptType {
    eInstallExec,
    eInstallCopy
  };
  
  union InstInfoBody switch(ScriptType) {
      case eInstallExec: CommandExecInfoBody CommandExec;
      case eInstallCopy: CopyInstallInfo CopyInstall;
    };


В отличие от Хаскель дискриминатор описывается отдельно от объединения. Сомнительный бенефит в том, что зато его можно многократно исопльзовать.
CommandExecInfoBody и CopyInstallInfo — определенные выше в IDL типы (для нас не существенные).

В C# имеем (лишние подробности вырезал):
[Serializable, RepositoryID("IDL:EsdAgent/ScriptType:1.0"), IdlEnum]
public enum ScriptType
{
    eInstallExec,
    eInstallCopy
}

[Serializable, RepositoryID("IDL:EsdAgent/InstInfoBody:1.0"), IdlUnion]
public struct InstInfoBody : IIdlEntity, ISerializable
{
    // Fields
    private CommandExecInfoBody m_CommandExec;
    private CopyInstallInfo m_CopyInstall;
    private ScriptType m_discriminator;

    // Methods
    // приведу тело одного метода только
    public CommandExecInfoBody GetCommandExec() 
    {
        if (this.m_discriminator != ScriptType.eInstallExec)
            throw new BAD_OPERATION(0x22, CompletionStatus.Completed_MayBe);

        return this.m_CommandExec;
    }

    public CopyInstallInfo GetCopyInstall();
    public void SetCommandExec(CommandExecInfoBody val);
    public void SetCopyInstall(CopyInstallInfo val);

    // Properties
    public ScriptType Discriminator { get; }
}


Для С++ компилятором IDL генерируется аналогичная структура.

Как этим пользоваться в отсутствии паттерн-матчинга? Непосредственный switch/case по Discriminator:
    switch(instInfoBody.Discriminator) {
    case ScriptType.eInstallExec:
        CommandExecInfoBody exec = instInfoBody.GetCommandExec();
        ...
        break;
    }


Теперь, если вернуться вообще к самому началу... В C# "дискриминатор" нам предоставляется самой CLR посредством GetType(). Он один на всех.
Как делать switch по типам, при отсутствии такой возможности в языке (если рассматривать обычные типы, а не генерённые IDL-компилятором)? Так же как и во всех других языках, где нет аналога swicth, т.е. через цепочки if/else.

Покажу для C++/CLR, т.к. там удобная возможность определения переменных и одновременной проверки на null:
if(Type1^ var1 = dynamic_cast<Type1>(obj)) { 
    // use var1 here ...
} else if (Type2^ var2 = dynamic_cast<Type2>(obj)) { ... }
} else { ... }


Если в паттерн матчинге оставить только одну строку, а все остальные варианты обозначить как "_", то как раз в аналогичный if/else и вырождается:
(не уверен в точности синтаксиса)
case obj of
    (Type1 var1) -> ...
    (_) -> case obj of 
        (Type2 var2) -> ...
        (_) -> ...


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

Да, алгебраические типы — очень удобная модель как раз для тех задач, где мы сегодня используем динамическое приведение в языках без оного. Внутренний механизм идентичен (даже для Хаскеля), но степень контроля компилятором значительно выше.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[37]: Проблемы организации OR-мапинга
От: EvilChild Ниоткуда  
Дата: 28.04.09 16:27
Оценка:
Здравствуйте, vdimas, Вы писали:

V>В этом примере One, Two — конструкторы алгебраического типа. Каждый из них конструирует обобщенный тип MyNum, заворачивая в него пустой тупл.

Какой ещё обобщённый тип? Т.е. там есть ещё и его конкретизации? GHCi считает иначе:

*Main> :t One
One :: MyNum
*Main> :t Two
Two :: MyNum

По его мнению One и Two имеют одинаковый тип — MyNum, что можно увидеть парой строк выше.
Нет там больше никаких других типов.
V>Случай вырожденный, размеченное объединение для всех своих значений состоит из собс-но кода разметки и ничего более, т.е. такое использование близко к enum из C++ или C#.
Если добавить аргументов конструкторам значений, то с точки зрения типов ничего не изменится.

V>Да, алгебраические типы — очень удобная модель как раз для тех задач, где мы сегодня используем динамическое приведение в языках без оного. Внутренний механизм идентичен (даже для Хаскеля), но степень контроля компилятором значительно выше.

Система типов и внутренний механизм её реализующий — это как бы очень разные вещи.
Механизм знать полезно, но то, что он реализует важнее.
Я не понимаю почему ты не хочешь провести границу между абстракцией и её реализацией.

Надо бы это обсуждение в ДП снести — может хардкорные функциональщики подтянутся.
now playing: Gui Boratto — Beluga
Re[73]: Проблемы организации OR-мапинга
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.04.09 18:46
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ну, мы же не про анализ говорим, а про ценообразование. Так? Далее, если FIFO, то сценарий, о котором ты рассказываешь, произойти никак не может. С утра на складе было 100шт по 10 рублей. Ты приехал продавать 80, тут поступили еще 100 по цене 20 рублей — цена никак не станет 15 рублей. Никакое налогообложение этого не потребует — это бред.


Агент берёт заказ. Товар будет клиенту доставлен самое скорое на следующий день.

S>Что такое "базовая цена"? Клиенту всё равно, что у вас там называется "базовой" ценой, а что — сборами аэропорта. Для него важна только конечная цена, и совершенно непонятно, почему он должен разбираться в тонкостях ваших поставок.


Глупости говоришь, конечно должен. Базовая цена — это цена одной штуки если покупать одну штуку. Если покупать много одной марки, то получаешь скидку на позицию. Если покупаешь просто много, то общую скидку. Если покупаешь весь ассортимент на большую сумму, то партнёрскую скидку в следующем месяце. Если платишь наличными или переводом, но сразу, то скидку за отсутствие кредита. Прошлые просроченные кредиты могут полностью или частично всё сказанное отменять.

A>>Плати штрафы за такую "оптимизацию"

S>Какие штрафы? За что именно? Рома, ты так загибаешь пальцы про свой опыт в учетных системах, что мне странно читать такие высказывания. Бухгалтерия по природе своей никогда не работает в реальном времени. Она всегда работает задним числом. Есть зарегулированные отрасли, как, к примеру, фармацевтика — и у нас вполне реально купить в аптеке две коробки одного и того же лекарства по разной цене — потому что у них жестко ограничены наценки, и себестоимость полностью определяет цену.

Я имею дело как раз с зарегулированной областью, но несколько иначе. Плавает себестоимость, цену мы менять не имеем права. Это требование производителя.

S>Но во всех остальных случаях рулит простое ценообразование, где цена является предметом соглашения сторон, а не результатом какой-то формулы.


Цена в данном случае фиксирована. Плавает только себестоимость.

S>Более того, документы оформляются более-менее задним числом, чтобы получить хоть какую-то целостность.


Скажем так, я точно знаю, что отставание бухгалтерии от реальности более, чем на неделю — это очень серьёзная проблема.

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


У нас происходит резервирование товара. Нельзя продать то, чего нет.

S>Поэтому бухгалтерская себестоимость возникает только в момент подготовки квартальной отчетности. И тут у бухгалтерии есть масса способов подогнать результаты к требуемым, оставаясь на все 100% в рамках закона.


Бухгалтерские документы вообще-то надо раз в месяц сдавать У нас, по крайней мере.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[74]: Проблемы организации OR-мапинга
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 28.04.09 20:51
Оценка:
Здравствуйте, adontz, Вы писали:

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


S>>Ну, мы же не про анализ говорим, а про ценообразование. Так? Далее, если FIFO, то сценарий, о котором ты рассказываешь, произойти никак не может. С утра на складе было 100шт по 10 рублей. Ты приехал продавать 80, тут поступили еще 100 по цене 20 рублей — цена никак не станет 15 рублей. Никакое налогообложение этого не потребует — это бред.


A>Агент берёт заказ. Товар будет клиенту доставлен самое скорое на следующий день.

Приходит к клиенту и называет большую цену, чем оговорено? Угадайте куда он пойдет.
Сколько видел всегда накладные и счета печатались по времени отправки.

S>>Более того, документы оформляются более-менее задним числом, чтобы получить хоть какую-то целостность.

A>Скажем так, я точно знаю, что отставание бухгалтерии от реальности более, чем на неделю — это очень серьёзная проблема.
Неправда. Товар может валяться на складе неоприходованным много вермени времени. Вот с налом действительно могут быть проблемы.
Обычно суетиться все начинают при наступлении конца отчетного периода.

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

A>У нас происходит резервирование товара. Нельзя продать то, чего нет.
Резвервирование (как часть складского учета) никак не связано с бухгалтерским учетом.

S>>Поэтому бухгалтерская себестоимость возникает только в момент подготовки квартальной отчетности. И тут у бухгалтерии есть масса способов подогнать результаты к требуемым, оставаясь на все 100% в рамках закона.


A>Бухгалтерские документы вообще-то надо раз в месяц сдавать У нас, по крайней мере.
Re[74]: Проблемы организации OR-мапинга
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.04.09 04:38
Оценка:
Здравствуйте, adontz, Вы писали:

A>Глупости говоришь, конечно должен.

Глупости говоришь ты, и тут же сам их опровергаешь.
A>Базовая цена — это цена одной штуки если покупать одну штуку. Если покупать много одной марки, то получаешь скидку на позицию. Если покупаешь просто много, то общую скидку. Если покупаешь весь ассортимент на большую сумму, то партнёрскую скидку в следующем месяце. Если платишь наличными или переводом, но сразу, то скидку за отсутствие кредита. Прошлые просроченные кредиты могут полностью или частично всё сказанное отменять.
Это всё правильно. Но заметь — в этом ценообразовании себестоимость никакой роли не играет. И не должна играть, потому что клиенту пофиг, что вы там по чём купили.

A>Я имею дело как раз с зарегулированной областью, но несколько иначе. Плавает себестоимость, цену мы менять не имеем права. Это требование производителя.

A>Цена в данном случае фиксирована. Плавает только себестоимость.
Рома, тогда о чём мы вообще говорим? Цена — фиксирована; себестоимость агента совершенно не полнует. Она не нужна для того, чтобы оформить заказ.

A>У нас происходит резервирование товара. Нельзя продать то, чего нет.

Дело не в резервировании. А в том, что товар идет на склад к дистрибьютору в счёт будущих оплат. У него нет себестоимости, потому что она определится потом — в тот момент, когда собственно произойдет оплата. А оплата происходит после реализации, т.к. свободных средств у нормального дистрибьютора нет.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[38]: Проблемы организации OR-мапинга
От: vdimas Россия  
Дата: 29.04.09 05:23
Оценка:
Здравствуйте, EvilChild, Вы писали:

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


V>>В этом примере One, Two — конструкторы алгебраического типа. Каждый из них конструирует обобщенный тип MyNum, заворачивая в него пустой тупл.

EC>Какой ещё обобщённый тип? Т.е. там есть ещё и его конкретизации? GHCi считает иначе:
EC>

EC>*Main> :t One
EC>One :: MyNum
EC>*Main> :t Two
EC>Two :: MyNum

EC>По его мнению One и Two имеют одинаковый тип — MyNum, что можно увидеть парой строк выше.

Они имеют тип ()->MyEnum. Это тип ф-ии, возвращающей значение MyEnum. Конструкторы — это всегда ф-ии во всех языках.
Зря ты рассматриваешь вырожденный случай, добавь туда параметр:
data MyNum a = One | Two | Three a

И посмотри, что тебе выдаст Three.

Обобщенный тип для алгебраического типа — это не аналог параметризуемого обобщенного типа из С++, это аналог union из того же С++. Это некий bag, куда заворачиваются другие типы, составляющие группу.

В общем, типы, входящие в группу, в общем случае не приводимы один к одному, поэтому нужен механизм, чтобы в одном аргументе передавать значения разных типов. Этот механизм — алгебраические типы. Типы заворачиваются в discriminated union.


EC>Если добавить аргументов конструкторам значений, то с точки зрения типов ничего не изменится.


Ты бы сначала добавил.

V>>Да, алгебраические типы — очень удобная модель как раз для тех задач, где мы сегодня используем динамическое приведение в языках без оного. Внутренний механизм идентичен (даже для Хаскеля), но степень контроля компилятором значительно выше.

EC>Система типов и внутренний механизм её реализующий — это как бы очень разные вещи.

Фиг там. Есть некая вычислительная модель, напр. модель алгебраических типов. И как она реализуется я показывал на листинге результата компиляции IDL. Вот конкретика не важна, а суть должна соответствовать вычислительной модели.

EC>Механизм знать полезно, но то, что он реализует важнее.


В случае алгебраических типов он 1-в-1 реализует "то, что он реализует".

EC>Я не понимаю почему ты не хочешь провести границу между абстракцией и её реализацией.


А я не понимаю твоего упорства — всё более чем прозрачно.

И как раз об абстракции и говорил в первом утверждении, что полиморфизм по алгебраическим типам — это классика динамической типизации. Могу усилить — это наилучший на сегодня способ использования динамической типизации.
Re[39]: Проблемы организации OR-мапинга
От: EvilChild Ниоткуда  
Дата: 29.04.09 05:55
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Они имеют тип ()->MyEnum. Это тип ф-ии, возвращающей значение MyEnum.

Этот тезис неплохо бы подтвердить сессией GHCi или что у тебя там установлено.
Ничто не подтверждает, что тип ()->MyEnum.

V>Зря ты рассматриваешь вырожденный случай, добавь туда параметр:

V>
V>data MyNum a = One | Two | Three a
V>

V>И посмотри, что тебе выдаст Three.
Смотри ниже.

EC>>Если добавить аргументов конструкторам значений, то с точки зрения типов ничего не изменится.


V>Ты бы сначала добавил.

Так добавил, результат тот же, тип всё равно один:

*Main> :i MyNum
data MyNum = One Int | Two String
*Main> :t One 1
One 1 :: MyNum
*Main> :t Two "2"
Two "2" :: MyNum


V>>>Да, алгебраические типы — очень удобная модель как раз для тех задач, где мы сегодня используем динамическое приведение в языках без оного. Внутренний механизм идентичен (даже для Хаскеля), но степень контроля компилятором значительно выше.

EC>>Система типов и внутренний механизм её реализующий — это как бы очень разные вещи.

V>Фиг там. Есть некая вычислительная модель, напр. модель алгебраических типов. И как она реализуется я показывал на листинге результата компиляции IDL. Вот конкретика не важна, а суть должна соответствовать вычислительной модели.


EC>>Механизм знать полезно, но то, что он реализует важнее.


V>В случае алгебраических типов он 1-в-1 реализует "то, что он реализует".


EC>>Я не понимаю почему ты не хочешь провести границу между абстракцией и её реализацией.


V>А я не понимаю твоего упорства — всё более чем прозрачно.


V>И как раз об абстракции и говорил в первом утверждении, что полиморфизм по алгебраическим типам — это классика динамической типизации. Могу усилить — это наилучший на сегодня способ использования динамической типизации.

Давай ты приведёшь хоть какую-то иллюстрацию, только не умозрительную, а вывод интерпретатора или что-то в этом роде из которой будет видно, что в рассматриваемом наме примере участвуют хотя бы 2 хаскельных типа.
А то тип вроде один, а ты говоришь оприведении. К какому типу мы приводим, если он один?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.