基于Agda论文在Idris中实现总分析器

Vic*_*ith 7 parsing parser-combinators agda dependent-type idris

我正在尝试使用Idris实现总解析器,基于本文.首先,我尝试实现更基本的识别器类型P:

Tok : Type
Tok = Char

mutual
  data P : Bool -> Type where
    fail : P False
    empty : P True
    sat : (Tok -> Bool) -> P False
    (<|>) : P n -> P m -> P (n || m)
    (.) : LazyP m n -> LazyP n m -> P (n && m)
    nonempty : P n -> P False
    cast : (n = m) -> P n -> P m

  LazyP : Bool -> Bool -> Type
  LazyP False n = Lazy (P n)
  LazyP True  n = P n

DelayP : P n -> LazyP b n
DelayP {b = False} x = Delay x
DelayP {b = True } x = x

ForceP : LazyP b n -> P n
ForceP {b = False} x = Force x
ForceP {b = True } x = x

Forced : LazyP b n -> Bool 
Forced {b = b} _ = b
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我无法弄清楚如何从论文中定义第一个例子.在Agda中它是:

left-right : P false
left-right = ? left-right . ? left-right
Run Code Online (Sandbox Code Playgroud)

但我不能让这个在伊德里斯工作:

lr : P False
lr = (Delay lr . Delay lr)
Run Code Online (Sandbox Code Playgroud)

产生

Can't unify 
    Lazy' t (P False)
with
    LazyP n m
Run Code Online (Sandbox Code Playgroud)

如果你给它一些帮助,它会发生变形,如下所示:

lr : P False
lr = (the (LazyP False False) (Delay lr)) . (the (LazyP False False) (Delay lr))
Run Code Online (Sandbox Code Playgroud)

但这被整体检查器拒绝,其他变体也是如此

lr : P False
lr = Delay (the (LazyP True False) lr) . (the (LazyP False False) (Delay lr))
Run Code Online (Sandbox Code Playgroud)

我不完全确定?运算符如何在Agda中绑定,这没有任何帮助.

任何人都可以看到在伊德里斯定义左右识别器的方法吗?我的P错误定义,还是我试图翻译这个功能?或者伊德里斯的整体检查是不是完全没有这个coinductive的东西?

ois*_*sdk 2

目前正在尝试自己移植这个库,似乎 Agda 向 Idris 推断了不同的隐式。这些是缺失的隐式:

%default total

mutual
  data P : Bool -> Type where
    Fail : P False
    Empty : P True
    Tok : Char -> P False
    (<|>) : P n -> P m -> P (n || m)
    (.) : {n,m: Bool} -> LazyP m n -> LazyP n m -> P (n && m)

  LazyP : Bool -> Bool -> Type
  LazyP False n = Inf (P n)
  LazyP True  n = P n

lr : P False
lr = (.) {n=False} {m=False} (Delay lr) (Delay lr)
Run Code Online (Sandbox Code Playgroud)