Ich versuche, Idris ein Beispiel aus dem Cayenne zu übersetzen - eine Sprache mit abhängigen Typenpaper. HierAbhängig typed printf in Idris
ist das, was ich bisher:
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]))
Ich verwende List Char
statt String
für das Format Argument, um mit Mustervergleich zu erleichtern, wie ich schnell in der Komplexität lief mit Pattern-Matching auf String
.
Leider bekomme ich eine Fehlermeldung, die ich nicht in der Lage bin zu machen Sinn von:
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
Wenn ich alle Muster Spiel Fällen mit 3 Elementen Kommentar aus (die mit '%' :: ...
) in PrintfType
und printf
, dann der Code kompiliert (macht aber offensichtlich nichts interessantes).
Wie behebe ich meinen Code, so dass printf "the %s is %d" "answer" 42
funktioniert? .
Welche Art von Beweis müssen Sie bereitstellen, um diese 'printf' mit einer Laufzeitzeichenfolge arbeiten zu lassen? – is7s
@ is7s, gute Frage, ich weiß es nicht. Ich habe seit dieser Frage/Antwort nicht mehr mit Idris gespielt. Ich kann eine Idee in http://eb.host.cs.st-andrews.ac.uk/drafts/eff-tutorial.pdf sehen, wo es _return einen Beweis, dass die ganze Zahl in dem erforderlichen Bereich zusammen mit der Ganzzahl selbst _ ist . Ich denke, Sie müssten die Formatzeichenfolge parsen und sie mit einem Beweis zurückgeben, der etwas 'Format' hat. – huynhjl