Pull to refresh
16K+
46
Николай Меркин@nickolaym

User

33,8
Rating
20
Subscribers
Send message

Какая скучная статья. Продавцы видят динамику продаж, всё!

Ни что, ни почему, ни технических подробностей.

Под техническими подробностями я имею в виду не то, что у вас в рекламных буклетах написано "с есим вы получите широкий ассортимент новых возможностей блаблабла", а - ну, хотя бы, как и какими именно из этих возможностей люди реально пользуются, а какие им нафиг не упали, но пришлось переплатить. Чем разные оси друг от друга отличаются, почему люди предпочитают то или другое. Насколько важен фактор вендорлока - то есть, если у человека айфон, то он, наверно, купит эплвоч, но так ли это в случае с другими платформами? Чем жертвует человек, покупая часы с есим (кроме цены)? И так далее и тому подобное...

Вам прислать фото разъединителя ВЛ-10? Вам рассказать, как его найти? Да проще некуда. Находите поселковый трансформатор 10-0.4 кВ, и на ближайшем же к нему столбе будет этот рубильник. Идёте от трансформатора вдоль ВЛ до ближайшей развилки, - и на развилке тоже будет рубильник.

А старинная детская забава кинуть проволоку на ЛЭП - это вообще в любом месте можно сделать, особенно, если линия не изолированная.

Насчёт много шума, нифига. Если в посёлке рубанулось электричество, то диспетчеру, конечно, оборвут телефон, но не более того. Мало ли что было, дерево на провода упало, что теперь, всей деревней по всему лесу бегать искать причину? Пусть аварийная бригада разбирается. А у них есть нормативы, как быстро приезжать. И на дальний хутор они просто на дорогу час-другой потратят.

Я тоже думал, что сюда ходят здравомыслящие. А не тупые демагоги, которые даже школьную математику не знают. Функция exp(-x) например монотонно убывает, а теперь давайте, вы, покажите, как она уходит в минус.

Статистику вы так и не показали, однако! Хоть "эту", хоть не эту, а вашу альтернативную. А здравомыслящие люди привыкли не верить пустым рекламным набросам.

Всё-таки, дизъюнкция - это не просто сложение, а сложение с насыщением. Поэтому от символа "+" возникает некое недоумение.

Хотя, конечно, дизъюнктивные формы удобнее читать со значками сложения и (неявного) умножения. Иначе от птичек вверх-вниз будет в глазах рябить.

Но об этом стоит сказать в самом начале статьи.

Генерал-электрик - это контора Эдисона.

... и в конце концов купил патент Лодыгина

Кому нужно не всё что душе угодно - берите не хаскелл, а идрис.

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

Например, derived::foo доступна тогда, когда доступна base::bar. Но base::bar доступна тогда, когда доступна (или не доступна) T::foo, где T = derived.

Ну а внутри функции можно делать ассерты. То есть, функция будет доступна, но, например, приводить к ошибке компиляции.

Кстати сказать, для создания неразрешимых зависимостей необязательно даже наследование. Достаточно сослаться на себя самого. Парадокс брадобрея, причём хоть переборчивого (который бреет только тех, кто не бреет себя), хоть просто любопытного (который бреет всех, но интересуется на входе).

struct barber {
  template<class T>
  void shaves(T& client)
  requires (!requires { client.shaves(client); })
  {} // этих рукожопов бреем так...

  template<class T>
  void shaves(T& client)
  requires (requires { client.shaves(client); })
  {} // а этих лентяев бреем этак...

  static_assert(requires(barber b) { b.shaves(b); });
  // рукожоп или лентяй?
};

(Это плохая иллюстрация, - зависимость будет неразрешима и за пределами определения класса. Просто чот внезапно пришло в голову показать фокус).

Ну а попроще, более классически, - почему класс в месте определения класса неполный, -

struct selfy {
  char c[sizeof(selfy)];
};

struct exploding {
  char e[sizeof(exploding) + 1];
};

struct okay {
  char o[123];
  int foo() { return sizeof(okay); }
};

Очень вычурный дизайн, когда один миксин чего-то хочет от другого миксина.

Брошу всё, стану проституткой.

В смысле что мешает.

А что мешает в хаскелле в IO-функции писать факью одновременно с выполнением какой-то полезной работы? А что мешает в чистой функции сделать unsafePerformIO и написать факью оттуда?

Нет, неизвестно. На этапе компиляции дженерик-функции она ничего не знает про типы аргументов, кроме того, что они принадлежат указанным тайпклассам.

Впрочем, это действительно детали реализации.

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

Во-первых, миллион - это копейки.

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

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

И зачем понадобился демонтаж светильников? Просто не включать их ночью, вот и всё?

Отсюда закрадывается мысль, что

в-третьих, монтажники дважды заработали, а не было ли тут эээ конфликта интересов у руководителя торгового центра?

При чём тут это?

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

С другой стороны, бродком тоже попался. Если т-мобайл упрётся рогом, то, во-первых, бродком потеряет жирного клиента, а во-вторых, нежирные посмотрят на успешный опыт миграции и тоже свалят.

Вот и выходит эта битва двух якодзун.

Войти на плечах хозяина - что с тамбуром, что без тамбура.

А если тамбур ровно на одного человека, - то это офигительно для детей, гостей, хозяина с собакой, бригады скорой помощи.

А одинокому параноику рано или поздно понадобится скорая помощь...

А если всё-таки упороться, - то... ну, придётся затащить словари. Только это уже будет явно.

using Object = std::shared_ptr<void>; // раз уж начали городить рантайм

struct IEqTraits { virtual bool op_eq(Object, Object) const = 0; };

template<class T> struct EqTraits : IEqTraits {
  bool op_eq(Object a, Object b) const override {
    auto ta = std::static_pointer_cast<T>(a);
    auto tb = std::static_pointer_cast<T>(b);
    return *ta == *tb;
  }
};

bool foo(
  // словари идут впереди аргументов
  IEqTraits const* eq,
  // упороться каррингом - это отдельное развлечение (не сейчас)
  Object a, Object b)
{
  return eq->op_eq(a, b) && eq->op_eq(b, a);
}

Для начала, нам нужен тайпкласс. Если мы не будем упарываться тем фактом, что в хаскелле тайпкласс неявно создаёт рантаймовую сущность "словарь виртуальных функций", - то аналог тайпкласса - это концепт.

#include <concepts>

// или руками напишем
template<class T> concept ad_hoc_eq = requires (T& x, T& y) { (bool)(x == y); };

template<std::equality_comparable T> auto foo(T, T) -> bool;

// вариант с GADT
// (когда мы не требуем, чтобы оба аргумента были одного типа)
// (и вообще не задумываемся про их тип)
auto foo(
  std::equality_comparable auto,
  std::equality_comparable auto
) -> bool;

Парсер - да, а не только анализатор.

А вы уверены, что тут нужно править именно лексер? Мне кажется, что подобная логика должна анализироваться даже не в парсере (так как с точки зрения синтаксиса тут все корректно), а на еще на уровень выше, в анализаторе.

Если обращаешься через интерфейс, то каким волшебным образом там будет доступна наследничья реализация невиртуальной функции?

А для шаблонов - ну, концепты и констрейны в помощь. Хотя и с оговорками. Как я уже написал ранее, CRTP не дружит с констрейнами. https://godbolt.org/z/dnhqz51qb

Кто мешает то же самое на плюсах?

template<std::comparable T, size_t N>
void sort(std::span<T,N> slice) {
  .....
}

void sort(auto& slice)
  requires requires {
    // нам нужно, чтобы над разыменованными итераторами был оператор <
    *std::begin(slice) < *std::begin(slice);
  }
{
  .....
}
1
23 ...

Information

Rating
254-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity