Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9

Претензии к Haskell

01.01.2015, 12:48. Показов 1656. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему нельзя было сделать однообразно?
Haskell
1
2
3
tst1 x
  | x == 0 = []
  | otherwise = [x]
но
Haskell
1
2
3
tst1 x = case () of
           _ | x == 0 -> []
             | otherwise -> [x]
т.е. в первом случае =, во втором ->.
Для охранных выражений otherwise, а для case, для этих же целей, служит просто _.
И лямбда выражения можно было записывать через =, чем они от именованных отличаются?
И, кстати, можно было бы несколько вариантов шаблонов записывать
Haskell
1
2
    map (\ []     = []
         \ (x:xs) = .... )
И охранные выражения, почему нельзя записывать везде где можно по смыслу без вставки заклинания case () of; _
Haskell
1
2
3
4
tst2 x = let r= x `div` (| x == 0 = 1
                         | _      = 3) in
         if 3 * (| odd r = 1
                 | _     = r) > 10 then r^2 else r^3
Или, вот, возьмём пример на LiveScript
JavaScript
1
2
3
4
take = (n, [x, ...xs]:list) -->
  | n <= 0     => []
  | empty list => []
  | otherwise  => [x] +++ (take n - 1, xs)
будучи переписанным на Haskell
Haskell
1
2
3
4
take' n list@(x:xs)
  | n <= 0    = []
  | null list = []
  | otherwise = x: take' (n - 1) xs
он выкинет исключение если список пуст или короче запрошенной длины. Почему здесь не работает лень? Пока мы не проверим null list нечего и пытаться разбирать шаблон - может он ещё и не понадобится.
На не ленивом, понимаешь, LiveScript шаблон когда надо разбирается, на ленивом Haskell падает.

Ладно, всё равно его не брошу потому что ... тут есть монады

Ещё раз, всех с Новым годом.

Добавлено через 8 минут
Ладно, для последнего примера я погорячился - шаблон нужно заранее разбирать для проверки соответствия, а не только для извлечения значений. На Haskell много шаблонов может быть.
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.01.2015, 12:48
Ответы с готовыми решениями:

Место ФП и Haskell в компьютерной индустрии (Для чего он нужен, этот Haskell?)
&quot;У нас&quot; ? А где преподавание этой экзотики на высоте? Добавлено через 2 минуты А где такие &quot;пришедшие&quot; используют...

Претензии от пользователей софта
Допустим я создал программу. Составлена она из нескольких исходников найденных у всемирной мусо паутине. Мало того, она еще создает...

Haskell
Ищу хаскелиста. Работа над серверной частью ERP системы. Кто заинтересовался писать на почту fclaw007@gmail.com или в личку

18
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
01.01.2015, 14:10
Я не знаток философии разработчиков Хаскеля, но могу предположить ход их мыслей.

Присваивание (назовём этот символ = так) заключается в том, что выражению справа даётся имя, записанное слева. Наличие слевая образцов и стражи — синтаксический сахар, нужный ради избежания лишних букв и лишнего case-of. Соответствие (->) по смыслу является сопоставление выражению слева, которое нам в некотором виде дано, выражению справа, которое нужно посчитать. Так, (\x -> M) сопоставляет каждому x выражение M, а case obj of x -> M, которое эквивалентно (\x -> M) obj, объекту obj, который выглядит как x, сопоставляет M.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Для охранных выражений otherwise, а для case, для этих же целей, служит просто _.
Не правда, _ несёт другой смысл, а otherwise (=True) есть в обоих случаях.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
И лямбда выражения можно было записывать через =, чем они от именованных отличаются?
Именованые объекты — фикция. Заинлайнили — и нет имени.
Наверное, да, можно было спроектировать язык без знака (=). Достаточно конструкцию let pat = expr in e заменить на let pat -> expr in e.
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
И, кстати, можно было бы несколько вариантов шаблонов записывать
Есть такое — lambda-cases (сам не пользовался, а вот кто-то из наших пользуется постоянно)
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
И охранные выражения, почему нельзя записывать везде где можно по смыслу без вставки заклинания case () of; _
ИМХО, бессмысленная конструкция case () of _. Как предполагается tst2 интерпретировать?
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Ладно, всё равно его не брошу потому что ... тут есть монады
Монады много где есть.

Мне много чего не нравится в Haskell. Взять хотя бы полуявную типизацию, над которой приходится шаманить, как только хочется протянуть полиморфизм куда-то вглубь терма (да-да, я люблю типизацию по Черчу) или объяснить, почему классовые операции применимы. В результате вся выгода неявного Хиндли-Милнера уходит в ноль, писать типы всё равно нужно. Ещё не нравится отсутствие внятной политики в отношении зависимых типов и сильного полиморфизма: у GHC есть много-много костылей расширений, но они выглядят немного несогласованными, не унифицированными.
Почему я остаюсь с Haskell? Лучше не нашел, да и разработчики нравятся.
2
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
01.01.2015, 14:59  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Соответствие (->) по смыслу является сопоставление выражению слева, которое нам в некотором виде дано, выражению справа, которое нужно посчитать
Всё равно избыточность зарезервированных сочетаний символов получается. И, в случае охранных выражений самой функции (там где и сейчас = ) так же, сопоставление, но ставится =, а не ->, только "ПАТАМУЧТО".

Цитата Сообщение от Mysterious Light Посмотреть сообщение
Не правда, _ несёт другой смысл, а otherwise (=True) есть в обоих случаях.
Я к тому, что для охранных выражений _ МОГЛО БЫ нести смысл True, т.к. оба применяются в смысле "в остальных случаях". Просто для компактности. Такие вещи мешаются при изменении кода - убираем case, проверку переносим в охранки, и приходится менять -> на =, _ на otherwise.

Цитата Сообщение от Mysterious Light Посмотреть сообщение
Есть такое — lambda-cases
Увы, оно убого.

Цитата Сообщение от Mysterious Light Посмотреть сообщение
Как предполагается tst2 интерпретировать?
Haskell
1
2
tst2 x = let r= x `div` (if x == 0 then 1 else 3) in
         if 3 * (if odd r then 1 else r) > 10 then r^2 else r^3
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Монады много где есть.
Я на полном серьёзе интересуюсь. А где ещё есть? Гуру ФП меня никак нельзя назвать.
Цитата Сообщение от Mysterious Light Посмотреть сообщение
я люблю типизацию по Черчу
Вы про это?
Цитата Сообщение от Mysterious Light Посмотреть сообщение
В результате вся выгода неявного Хиндли-Милнера уходит в ноль, писать типы всё равно нужно.
Тут я только за. Чем больше приходится уточнять и получать compile-time ошибок - тем меньше runtime.
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
01.01.2015, 15:34
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Вы про это?
Нет, я про λ-куб. Посмотрите, например, H. Barendregt Lambda Calculi With Types, глава 5 Typing à la Church.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Тут я только за. Чем больше приходится уточнять и получать compile-time ошибок - тем меньше runtime.
Я потому только не кричу во всё горло, что неявная типизация непригодна и всеобщее зло, что при явной типизации замучается программист выписывать все типы. Хиндли-Милнер тем и была хороша, что почти все типы она выводила сама. Но вот есть классы, а сейчас хотим ввести экзистенциальные типы и сильный полиморфизм или ещё что, и все типы программист вынужден снова писать вручную. В чём смысл? Почему бы не перейти на более явную систему типов.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Всё равно избыточность зарезервированных сочетаний символов получается. И, в случае охранных выражений самой функции (там где и сейчас = ) так же, сопоставление, но ставится =, а не ->, только "ПАТАМУЧТО".
Я готов согласиться с тем, что можно было спроектировать язык без знака =. Но образцы и охранные выражения здесь не при чем. На данный момент = ставится при объявлении имени новой функции, а -> ставится для связывания внутри терма. Образцы и охрана может быть, а может и не быть, как в одном, так и в другом случае.
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Я к тому, что для охранных выражений _ МОГЛО БЫ нести смысл True, т.к. оба применяются в смысле "в остальных случаях". Просто для компактности. Такие вещи мешаются при изменении кода - убираем case, проверку переносим в охранки, и приходится менять -> на =, _ на otherwise.
Не понял. Образец _ не может переходить в otherwise :: Bool.
Вы же говорите про соответствие
Haskell
1
2
3
4
5
6
7
8
f p1 | g1 = e1
f p2 | g2 = e2
...
 
f arg = case arg of
  p1 | g1 -> e1
  p2 | g2 -> e2
  ...
?
0
 Аватар для Araneo
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
01.01.2015, 15:47
А я придерусь, с другой стороны. На мой взгляд знак =, в охранных выражениях должен писаться как -> . Во всех иных местах он значит присваивание имени выражению. А там эта функция несколько смывается. По мне уж лучше бы было писать.
Haskell
1
2
3
tst1 x = if
    | x == 0    -> [] 
    | otherwise -> [x]
Что кстати можно, просто для единообразия.

Добавлено через 5 минут
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Haskell
1
2
3
4
5
6
f p1 | g1 = e1
f p2 | g2 = e2
...
f arg = case arg of
 p1 | g1 -> e1
 p2 | g2 -> e2
...
До последних версий компилятора, этот код не был эквивалентен...
1
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
01.01.2015, 15:51  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Образец _ не может переходить в otherwise :: Bool.
_ в шаблоне типа (x:_) - это одно. А
Haskell
1
2
3
4
tst4 i = case i of
            []  -> "empty"
            [c] -> "one"
            _   -> "else/otherwise/ C default"
он означает, по смыслу другое. Можно было бы сделать особый случай "| _ =" - означало бы "выполнить если остальные условия не подошли".
0
 Аватар для Araneo
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
01.01.2015, 15:59
надо пояснить значит поясню. До 7.6 по моему включительно. Не уверен, нет старого компилятора чтоб проверить. Выражение сопоставлялось с первым удачным образцом. И забыв про все остальные, проверяло условия в гвардах, если такового не было, падало с ошибкой, даже если другой образец был вполне рабочий, но находился после. Сейчас это не так.
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
01.01.2015, 16:06  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
а сейчас хотим ввести экзистенциальные типы
Я тут, возможно, плыву, но вы их же их сами и включаете, по умолчанию они выключены. Насколько совместимы с Х-М , и насколько нужны ...
Haskell Antipattern
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
01.01.2015, 16:10
Странное поведение ранних версий, не по документации.

Цитата Сообщение от Araneo Посмотреть сообщение
А я придерусь, с другой стороны. На мой взгляд знак =, в охранных выражениях должен писаться как -> . Во всех иных местах он значит присваивание имени выражению. А там эта функция несколько смывается. По мне уж лучше бы было писать.
Haskell
1
2
3
tst1 x = if
    | x == 0    -> [] 
    | otherwise -> [x]
Что кстати можно, просто для единообразия.
Здравая мысль. Как по мне, нужно было б ввести подобную конструкцию if | c1 then e1; | c2 then e2; | c3 then e3; ... в значении if c1 then e1 else if c2 then e2 else if c3 then e3 else ...
Только учтите, что, если if-условия-значения стоит по правую сторону от =, то они являются частью выражения справа, которое оценивается после выбора подходящего образца, а значит, если все условия нарушатся, то программа не сможет пойти дальше и сравнивать с другими образцами. Или же нужно будет вводить механизм, позволяющий изнутри выражения отвергать образец и переходить к следующему.
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
01.01.2015, 16:17  [ТС]
Цитата Сообщение от Araneo Посмотреть сообщение
По мне уж лучше бы было писать.
tst1 x = if
* * | x == 0 * *-> []
* * | otherwise -> [x]
Так это и сейчас можно, с MultiWayIf.

Меня, похоже, не поняли. Я за минимизацию словаря языка, только и всего.

Добавлено через 3 минуты
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Только учтите, что, если if-условия-значения стоит по правую сторону от =, то они являются частью выражения справа, которое оценивается после выбора подходящего образца, а значит, если все условия нарушатся, то программа не сможет пойти дальше
Исключения она тогда выкидывает "*** Exception: Tst.hs : ( 23,10)-(25,19): Non-exhaustive guards in multi-way if"
0
 Аватар для Araneo
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
01.01.2015, 22:16
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Меня, похоже, не поняли. Я за минимизацию словаря языка, только и всего.
А я за чёткое разделение, смыслов лексем, и за ювелирный подбор базовых понятий. Минимизация тоже нужна, но её вершиной увы будет чистое лямбда исчисление.
1
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
01.01.2015, 22:44
Цитата Сообщение от Araneo Посмотреть сообщение
Минимизация тоже нужна, но её вершиной увы будет чистое лямбда исчисление.
Что именно мы хотим минимизировать?
Скажем, убрать data не получится. Ещё не получится убрать let-in или case-of. И так далее. Убирёте что-нибудь подобное — и язык обеднеет.
А можно говорить о сахаре и прочих сладостях, которые можно убрать и язык сохранит свою выразительность, только будет более многословным, страдает удобство.
И последнее: можно ли что-то убрать из языка так, чтоб язык не обеднел и при этом остался примерно настолько же удобным?

Мне, например, интересно, какую из лямбда-систем (а их тысячи) можно выбрать в качестве базы для более лучшего (удобного) языка, чем Haskell. Если получится, займусь этим в рамках исследовательской работы в будущем году.
0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
02.01.2015, 02:40  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Что именно мы хотим минимизировать?
Я уже много раз указал: дублируются = и -> в схожих конструкциях множественного ветвления и определения именованных и лямбда функций. Другое дублирование, | otherwise и _ ТОЛЬКО КАК ВАРИАНТ ВЕТВЛЕНИЯ. Т.е. я полагаю что вместо
Haskell
1
2
3
4
5
6
tst5 x  
    | x == 0    = [] 
    | otherwise = case cos x of
                     0 -> "+- Pi/2"
                     _  | x < 0     -> concatMap (\ v -> show v) [x..0]
                        | otherwise -> concatMap (\ v -> show v) [0..x]
должно быть
Haskell
1
2
3
4
5
6
tst5 x  
    | x == 0    = [] 
    | _         = case cos x of
                     0 = "+- Pi/2"
                     _  | x < 0  = concatMap (\ v = show v) [x..0]
                        | _      = concatMap (\ v = show v) [0..x]
(Ну, если очень хочется, замените ВСЕ = на ->). Повторяю: особое сочетание "| _ =" означает "| True =" и _ отдельно здесь не трактуется как "любой" или "игнор".

При этом язык ничего не теряет. Конверсия в такой вариант возможна чуть ли не через sed.

data безусловно, отличается от type и newdata - все нужны. Тут только авторов можно упрекнуть в невыразительности и неуместности применённых слов. Я бы использовал, соответственно, type, alias и easytype.

До кучи, я бы ввёл контроль диапазонов на целые числа, или даже возможность навесить свою проверяющую функцию на тип. Понятно, такие возможности можно было бы отключать ключом. Это для отладки и тестирования. По моему, это не противоречит ФП.

Не по теме:

Цитата Сообщение от Mysterious Light Посмотреть сообщение
Если получится, займусь этим в рамках исследовательской работы в будущем году
Осмелюсь спросить, а чем именно вы занимаетесь? Совсем кратко, конечно. Но учитывая что сказал Эйнштейн про объяснение сути своего исследования ребёнку. Я в компиляторостроителстве и около точно ребёнок.

0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
02.01.2015, 13:17
Лучший ответ Сообщение было отмечено KolodeznyDiver как решение

Решение

KolodeznyDiver, в целом я согласен с Вами.

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
До кучи, я бы ввёл контроль диапазонов на целые числа, или даже возможность навесить свою проверяющую функцию на тип. Понятно, такие возможности можно было бы отключать ключом. Это для отладки и тестирования. По моему, это не противоречит ФП.
Мб, стоит использовать зависимые типы?

Не по теме:

Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Осмелюсь спросить, а чем именно вы занимаетесь? Совсем кратко, конечно. Но учитывая что сказал Эйнштейн про объяснение сути своего исследования ребёнку. Я в компиляторостроителстве и около точно ребёнок.
Кратко: я металлофизик.
Хочу заняться всерьёз теорией ФП, войти в «большую науку». Может, сойдусь с Филиппом Уадлером или кем-то столь же значимым.
Кстати, в компиляторострое я тоже не разбираюсь. Как и в параллелизме ((

0
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
02.01.2015, 13:59  [ТС]
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Мб, стоит использовать зависимые типы?
Как они помогут для range check-инга?

Не по теме:

Цитата Сообщение от Mysterious Light Посмотреть сообщение
Хочу заняться всерьёз теорией ФП, войти в «большую науку». Может, сойдусь с Филиппом Уадлером или кем-то столь же значимым.
Успехов.

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,710
Записей в блоге: 14
02.01.2015, 14:22
По духу согласен с Araneo. Богатство любого языка основано на некоторой избыточности.
0
 Аватар для Araneo
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
02.01.2015, 15:12
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- Вот что должно быть на мой взгляд, и как ни странно, оно возможно
tst5 x = if 
    | x == 0    -> [] 
    | otherwise -> case cos x of
                     0              -> "+- Pi/2"
                     _  | x < 0     -> concatMap (\ v -> show v) [x..0]
                        | otherwise -> concatMap (\ v -> show v) [0..x]
-- И чтоб моё чувство прекрасного не возмущалось. Хоть и понятно, что не нужно.
tst5 x = case cos x of
    _   | x == 0    -> []
    0               -> "+- Pi/2"
    _   | x < 0     -> concatMap show [x..0]
        | otherwise -> concatMap show [0..x]
-- Или даже так.
tst5 x = if
    | x == 0    -> []
    | cos x == 0-> "+- Pi/2"
    | x < 0     -> concatMap show [x..0]
    | otherwise -> concatMap show [0..x]
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,710
Записей в блоге: 14
02.01.2015, 15:31
Раз у всех такие претензии - сделайте пропроцессор!
0
 Аватар для Araneo
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
02.01.2015, 15:43
Все мои претензии, чудным образом, после включения соответствующих прагм, работают в рамках ghc...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.01.2015, 15:43
Помогаю со студенческими работами здесь

HASKELL
Добрый вечер, прошу помощи у знающих Haskell, не понимаю его, не для меня видимо, но сдать дисциплину надо, не хотелось бы вылететь с...

Задачки по Haskell
Определить последовательность, в которой каждый элемент — список всех простых делителей соответствующего целого числа. У меня генерирует...

Типы в Haskell
Здравствуйте. Помогите пожалуйста выполнить задания. в Хаскелле не разбираюсь. нужне сделать несколько функций и выражений. Приведите...

Clean vs Haskell
Интересует подробное сравнение чистых функциональных языков программирования семейства ML: Clean и Haskell. В И-нете как-то немного...

Массивы в Haskell
У меня возникла такая проблемма. Нужно на Haskell, написать программу, которая находит нужный массив и удаляет его. Прошу помочь. Зараннее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru