169 похожих чатов

На проекте, где много начинающих хаскеллистов, включая меня, случился такой

неприятный инцидент с долгим дебагом.

Объявлялся newtype и instance Show для него, и по недосмотру он был определен так:
instance Show MyNT where
show s = show s <> "blah!"

Вопрос, есть ли что-либо, что однозначно поймает такой кейс на стадии компиляции? У нас включен -Wall -Werror, и даже есть линтинг через Stan, но всё равно проскочило.

28 ответов

27 просмотров

hlint?

ну, этот код В ДАННОМ случае раценивается как неправильный, но вообще это валидный код который имеет место быть, для работы с бесконечными стримами например

Andrey
hlint?

хотя не уверен

Andrey
хотя не уверен

- warn: {lhs: "instance Show x"...

Очевидно, надо предоставить доказательство, что show завершается

Andrey
- warn: {lhs: "instance Show x"...

хотя это глобально бить будет

Andrey
хотя это глобально бить будет

хотя может лучше Show дерайвить и бить по рукам за ручные инстансы, а претти-принтеры писать уже но я рулы для хлинта не писал, так что надо пробовать

Max-Avanov Автор вопроса
Andrey
хотя это глобально бить будет

да, нужно именно потенциальную бесконечную рекурсию в show но не в списках, например

Max-Avanov Автор вопроса
Andrey
хотя может лучше Show дерайвить и бить по рукам за...

дерайвить тоже можно, только как тогда лучше всего делать кастомный формат с дополнительными суффиксами? Через отдельный тайпкласс?

Max-Avanov Автор вопроса
Andrey
не понял про суффиксы

ну там newtype создан только для того, чтобы в Show a => ... при выводе добавлял к оригинальному значению некоторый суффикс, который отображает единицу измерения

ㅤ Атеист
Очевидно, надо предоставить доказательство, что sh...

А, блин, наверное, на Haskell этого не получится сделать

Andrey
хм, ну тогда лучше свой тайпкласс

но это потенциально не остановит завязаться на Show и в инстансе применить show, чего хотелось бы избежать, как я понял

Andrey
но это потенциально не остановит завязаться на Sho...

не, избежать хотелось бы рекурсии бесконечной

Max-Avanov Автор вопроса
Max Avanov
да

задача минимизировать количество подобных foot-guns для всех новичков

Max-Avanov Автор вопроса

Хрюкнул

Agda

Max-Avanov Автор вопроса
TOV_MULTIMASSO
Agda

Ну как бы да, но нет конечно

Max-Avanov Автор вопроса
Max Avanov
Ну как бы да, но нет конечно

При этом мой линейный менеджер не против затестить где-нибудь unison, только нет для этого проекта реалистичного

Ограничьте размер стека. Если стек вышибает, это обычно легко отдебажить. У Митчелл про это несколько постов есть

Max-Avanov Автор вопроса
Roman
Ограничьте размер стека. Если стек вышибает, это о...

Мы сейчас ограничили через -M, а какой флаг ограничивает тот самый «стек»?

Max-Avanov Автор вопроса
Max Avanov
https://ndmitchell.com

А, точно, спасибо! Стоило человеку в Фейсбук уйти и я про него забыл :-)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта