Я действительно люблю использовать тотальные функции.Тем не менее, иногда я не уверен, что лучший подход для гарантии этого.Допустим, я пишу функцию, похожую на 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, и просто иметь дело с дополнительными накладными расходами, но я обеспокоен тем, что буду пнуть себя в будущем.Это решение должно приниматься в каждом конкретном случае или есть общая стратегия, которая последовательно работает лучше всего?