Type-Driven Development с Идрисом представляет это упражнение:Определение равенства Списков Функция
same_cons : {xs : List a} -> {ys : List a} -> xs = ys -> x :: xs = x :: ys
Однако, я попытался реализовать с помощью:
data EqList : (xs : List a) -> (ys : List a) -> Type where
Same : (xs: List a) -> EqList xs xs
sameS : (xs : List a) -> (ys : List a) -> (x: a) -> (eq : EqList xs ys) -> EqList (x :: xs) (x :: ys)
sameS xs xs x (Same xs) = Same (x :: xs)
same_cons : {xs : List a} -> {ys : List a} -> (eq : EqList xs ys) -> EqList (x :: xs) (x :: ys)
same_cons {xs} {ys} eq = sameS xs ys _ eq
Я выводил x
в EqList (x :: xs) (x :: ys)
, потому что я m путают, как получить x
, если xs
и ys
пустые.
Кроме того, вышеуказанные компилирует, но это не удалось, когда я попытался назвать:
*Exercises> same_cons (Same [1,2,3])
(input):Can't infer argument x to same_cons