#idris #dependent-type
#idris #зависимый тип
Вопрос:
decLte : (n : Nat) -> (m : Nat) -> Dec (LTE n m)
decLte Z _ = Yes LTEZero
decLte (S _) Z = No (x => case x of LTEZero impossible ; LTESucc _ impossible)
decLte (S n) (S m) with (decLte n m)
| Yes ltePrf = Yes (LTESucc ltePrf)
| No lteContra = No ((LTESucc p) => lteContra p)
data NatRange : Type where
In : (l: Nat) -> (u: Nat) -> {auto yep : decLte l u = Yes _} -> NatRange
natRangeEx1 : NatRange
natRangeEx1 = In 500 2100
Проверка типа в этом коде занимает около 5 минут и использует > 2 ГБ памяти. Я ошеломлен чрезвычайно низкой производительностью. Может ли кто-нибудь назвать мне вескую причину, например, это проблема моего кода или проблема, присущая Idris?
Комментарии:
1. Вы уверены, что это сам Idris? Мой компьютер часто зависал в конце концов (с чрезвычайно высоким потреблением памяти) после того, как я запустил компиляцию своего кода. Однако я не совсем уверен, виноват ли сам Idris или, возможно, используемый мной плагин Atom. Однако в моем случае это происходит довольно случайно: иногда один и тот же код компилируется быстро, в другой раз это полностью убивает машину…
2. Я могу подтвердить, что это происходит очень медленно. Также переход на встроенную
isLTE
функцию не имеет значения. Причиной является500
параметр. Если изменить его на что-то близкое к нулю, это будет значительно быстрее. К сожалению, мне не удалось скомпилировать код с помощью blodwen.3. Действительно, теперь я также могу подтвердить, что мои проблемы вызваны самим Idris.