Идрис не распознает эквивалентные типы - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь реализовать биномиальные кучи в Idris, поэтому я определил тип

data Bin = MSEnd | B0 Bin | B1 Bin

, где MSEnd обозначает «Наиболее значимый конец» (например, B0 (B1 (B1 MSEnd)) представляет 6).

Я также определил функцию для их сложения. Я проверил это, и он работает как ожидалось (как и вспомогательная функция succ, которая увеличивает двоичное число).

plus : Bin -> Bin -> Bin
plus MSEnd b = b
plus b MSEnd = b
plus (B0 a) (B0 b) = B0 $ plus a b
plus (B0 a) (B1 b) = B1 $ plus a b
plus (B1 a) (B0 b) = B1 $ plus a b
plus (B1 a) (B1 b) = B0 . succ $ plus a b

Однако в другой функции, сигнатура типа которой зависит от этого plus функция, я получаю ошибку компилятора

Type mismatch between
                b1
        and
                plus b1 MSEnd

Основываясь на определении plus, кажется, что компилятор Idris должен легко определить, что они равны. Что здесь не так?

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