Я бы предпочел, чтобы программа остановилась с ошибкой в неопределенном случае, а не возвращала функцию Ничего.
Стандартный и идиоматический способ сделать это, безусловно,верните Maybe Int
вместо того, чтобы делать то, что вы предпочитаете делать.
Если вы спрашиваете, как вызвать ошибку из чистого кода, вы можете сделать
f ... = error "oops it wasn't a perfect square"
Другая возможность состоит в том, что ваш ввод [Int]
неправильного типа.Возможно, то, что вы хотите, это список, который гарантированно имеет степень двух длин.В этом случае вы можете создать умный конструктор (функция, которая является единственным способом создания PowerOfTwoList a
и которая выполняет проверку).Вы также можете использовать какой-то вектор с индексом длины, где натуральный уровень типа является степенью двойки (т. Е. Длина списка представлена в типе и также корректна по построению)