частичные функции против проверки ввода - PullRequest
0 голосов
/ 03 апреля 2019

Я действительно люблю использовать тотальные функции.Тем не менее, иногда я не уверен, что лучший подход для гарантии этого.Допустим, я пишу функцию, похожую на chunksOf из пакета split, где я хочу разделить список на подсписки заданного размера.Теперь я бы действительно сказал, что вход для размера подсписка должен быть положительным int (поэтому исключая 0).На мой взгляд, у меня есть несколько вариантов:

1) all-out: сделать newtype для PositiveInt, скрыть конструктор и предоставить только безопасные функции для создания PositiveInt (возможно, возвращающего * 1009).* или какой-то союз Positive | Negative | Zero или что там у вас).Кажется, что это может быть огромной проблемой.

2) что делает пакет split: просто возвращайте бесконечный список подсписков размера 0, если размер <= 0. Это похоже на то, что вы рискуете, что ошибки не будут пойманыи что еще хуже: эти ошибки просто бесконечно вешают вашу программу без указания того, что пошло не так. </p>

3) что делают большинство других языков: error, когда ввод <= 0. Я действительно предпочитаю тотальные функции, хотя... </p>

4) вернуть Either или Maybe, чтобы охватить случай, когда входное значение могло быть <= 0. Подобно # 1, кажется, что использование этого может быть просто хлопотным.</p>

Это похоже на этот пост, но это больше связано с ошибочными условиями, чем просто быть как можно более точным о типах.Я ищу мысли о том, как решить, каков наилучший подход для такого случая.Я, вероятно, больше всего склонен к выполнению № 1, и просто иметь дело с дополнительными накладными расходами, но я обеспокоен тем, что буду пнуть себя в будущем.Это решение должно приниматься в каждом конкретном случае или есть общая стратегия, которая последовательно работает лучше всего?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...