this paper numaralı telefondan, Idris ile toplam ayrıştırıcıları uygulamaya çalışıyorum. Önce daha temel tanıyıcı türünü P
uygulamaya çalışmıştır:Agda'da Kağıt Üzerine İdeada Toplam Parsers Uygulamak
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
Bu iyi çalışır, ama kağıttan ilk örneği tanımlamak nasıl çalışamaz.
left-right : P false
left-right = ♯ left-right . ♯ left-right
Ama bu İdris'i çalışmak için alınamıyor: Agda sırf
lr : P False
lr = (Delay lr . Delay lr)
böyle, o biraz yardım eğer typecheck olacak
Can't unify
Lazy' t (P False)
with
LazyP n m
üretir:
lr : P False
lr = (the (LazyP False False) (Delay lr)) . (the (LazyP False False) (Delay lr))
Ancak bu reddedildi Ben ♯
operatör Agda içinde nasıl bağlandığını tamamen emin değilim yardımcı olmuyor
lr : P False
lr = Delay (the (LazyP True False) lr) . (the (LazyP False False) (Delay lr))
gibi diğer varyantları olduğu gibi, Bütünlük denetleyici tarafından ed.
Idris'da sol-sağ tanıtıcıyı tanımlamanın bir yolu var mı? P
tanımım yanlış mı, yoksa işlevi tercüme etme girişimi mi? Ya da Idris'un bütünlük kontrolörü, bu dolandırıcılık işine kadar değil mi?
Bu işler! Bundan çok uzaktayım, bunu yeniden düzeltmek ve neden işe yaradığını anlamak için biraz zaman harcayacağım. Bunu yaptıktan sonra kabul edeceğim. –