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

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

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

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

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

28 ответов

24 просмотра

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

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
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
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта