当我尝试在REPL中使用依赖类型的函数时,我在Idris中遇到意外类型错误的问题。这就是我所拥有的:
data Expr : Type -> Type where
Null : Expr ()
Lift : Show a => a -> Expr a
Add : Num a => Expr a -> Expr a -> Expr a
Mul : Num a => Expr a -> Expr a -> Expr a
data Context : Type where
Root : Context
Error : String -> Context
L : Expr a -> Context -> Expr b -> Expr c -> Context
R : Expr a -> Context -> Expr b -> Expr c -> Context
M : Expr a -> Context -> Expr b -> Expr c -> Context
data Zipper : Type -> Type where
Z : Expr a -> Context -> Zipper a
E : String -> Context -> Zipper String
UnZip : Zipper b -> Type
UnZip (Z {a} e c) = Expr a
UnZip (E x c) = String
unZip : (x : Zipper a) -> UnZip x
unZip (Z e c) = e
unZip (E x c) = x
total
ZipRight : Zipper a -> Type
ZipRight (Z (Add {a} l r) c) = Zipper a
ZipRight (Z (Mul {a} l r) c) = Zipper a
ZipRight _ = Zipper String
err : String
err = "Some Error"
total
right : (x : Zipper a) -> ZipRight x
right (Z Null c) = E err c
right (Z (Lift _) c) = E err c
right (Z (Add l r) c) = Z r (R (Add l r) c Null l)
right (Z (Mul l r) c) = Z r (R (Mul l r) c Null l)
当我在REPL中运行以下内容时
unZip $ right $ Z (Add (Lift 2) (Mul (Lift 3) (Lift 4))) Root
我得到了预期的Expr Integer
。
当我在该行中添加额外的right
时
unZip $ right $ right $ Z (Add (Lift 2) (Mul (Lift 3) (Lift 4))) Root
我在ZipRight (right (Z (Add (Lift 2) (Sub (Lift 4) (Lift 5))) Root)) (Type of right (right (Z (Add (Lift 2) (Sub (Lift 4) (Lift 5))) Root)))
和Zipper a (Expected Type)
但正在运行right $ right $ Z (Add (Lift 2) (Mul (Lift 3) (Lift 4))) Root
会显示预期的Zipper Integer
。
我想知道的是。为什么我在第二次调用right
时出现类型错误,是否有一种方法可以修复我的代码,使得错误不再发生,或者我可以以这样的方式重构问题被规避了吗?
亲切的问候,
多诺万
答案 0 :(得分:0)
使功能完全修复问题。 至于为什么问题首先发生,我仍然在黑暗中!