Рассмотрим следующий (очень упрощенный) пример ограничения типа данных с помощью побочного условия на его значениях:
data Transport = Car | Foot | Boat
total wheels : (transport : Transport) -> {auto hasWheels : transport = Car} -> Int
wheels Car {hasWheels = Refl} = 4
wheels Foot {hasWheels = Refl} impossible
wheels Boat {hasWheels = Refl} impossible
Можно ли как-то опустить или суммировать случаи impossible
и до сих пор Идрис видит функцию как полную? Если я пропущу кейс, то получу что-то вроде
Main.wheels is not total as there are missing cases
, я также не смогу просто получить универсальный кейс, так как компилятор не знает, что _
не может быть Car, поэтому вторая строка не проверяет тип:
wheels Car {hasWheels = Refl} = 4
wheels _ {hasWheels = Refl} impossible
Это дает
wheels _ is a valid case
Я рассмотрел идеи в этом посте об ограничении типов данных , но Я не вижу подходов, которые бы помогли.
В реальном коде это упрощается, есть много случаев, каждый из которых должен выполняться отдельно, что делает его очень громоздким.