Idris - 在依赖类型函数中键入错误

时间:2018-01-03 00:42:52

标签: functional-programming idris dependent-type

当我尝试在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

当我在该行中添加额外的rightunZip $ 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时出现类型错误,是否有一种方法可以修复我的代码,使得错误不再发生,或者我可以以这样的方式重构问题被规避了吗?

亲切的问候,

多诺万

1 个答案:

答案 0 :(得分:0)

使功能完全修复问题。 至于为什么问题首先发生,我仍然在黑暗中!