Bağımlı olarak yazdırılan printf'e,Cayenne - bağımlı türlerine sahip bir dil olan Idris'a bir örnek çevirmeye çalışıyorum.Idris
PrintfType : (List Char) -> Type
PrintfType Nil = String
PrintfType ('%' :: 'd' :: cs) = Int -> PrintfType cs
PrintfType ('%' :: 's' :: cs) = String -> PrintfType cs
PrintfType ('%' :: _ :: cs) = PrintfType cs
PrintfType (_ :: cs) = PrintfType cs
printf : (fmt: List Char) -> PrintfType fmt
printf fmt = rec fmt "" where
rec : (f: List Char) -> String -> PrintfType f
rec Nil acc = acc
rec ('%' :: 'd' :: cs) acc = \i => rec cs (acC++ (show i))
rec ('%' :: 's' :: cs) acc = \s => rec cs (acC++ s)
rec ('%' :: _ :: cs) acc = rec cs acc -- this is line 49
rec (c :: cs) acc = rec cs (acC++ (pack [c]))
hızla desen String
üzerinde eşleşen karmaşıklığı içine koşarken desen eşleştirme ile kolaylaştırmak amacıyla ben biçimi argüman için String
yerine List Char
kullanıyorum: Burada
PrintfType
elemanların (
'%' :: ...
olanlar) ve
printf
ile tüm desen maç davaları açıklama o zaman,
Type checking ./sprintf.idr
sprintf.idr:49:Can't unify PrintfType (Prelude.List.:: '%' (Prelude.List.:: t cs)) with PrintfType cs
Specifically:
Can't convert PrintfType (Prelude.List.:: '%' (Prelude.List.:: t cs)) with PrintfType cs
:
Ne yazık ki ben bir anlam çıkarmaya muktedir değilim bir hata mesajı alıyorum kod derler (ama açıkçası ilginç bir şey yapmaz).
Kodumu printf "the %s is %d" "answer" 42
çalışacak şekilde nasıl düzeltirim? .
Bu printf'in çalışma zamanı dizesiyle çalışmasını sağlamak için ne tür bir kanıt gerekli? – is7s
@ is7s, iyi soru, bilmiyorum. Bu soru/cevaptan beri İdris ile oynamamıştım. Http://eb.host.cs.st-andrews.ac.uk/drafts/eff-tutorial.pdf adresinde, tamsayıyı tamsayı ile birlikte tamsayıda olduğunu ispatlayan bir fikrin olduğunu söyleyebilirim. . Bu yüzden format dizisini ayrıştırmanız ve bazı "Format" olan bir ispatla geri döndürmeniz gerektiğini düşünüyorum. – huynhjl