私はIdryに翻訳しようとしていますからの例Cayenne - 従属型の言語paperです。Idrisに依存型printf
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]))
私はすぐにパターンがString
に一致すると複雑に走ったようなパターンマッチングを容易にするために、私はフォーマット引数にString
の代わりにList Char
を使用しています:ここで
PrintfType
の要素(
'%' :: ...
を持つもの)と
printf
で、すべてのパターンマッチの例をコメントアウトした場合、その後、
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
:
は、残念ながら、私は私がの意味を理解することはできませんよ、エラーメッセージが表示されますコードはコンパイルされます(しかし、明らかに興味深いことはありません)。
printf "the %s is %d" "answer" 42
が機能するようにコードを修正するにはどうすればよいですか? 。
この 'printf'を実行時文字列で動作させるにはどのような証明が必要ですか? – is7s
@ is7s、良い質問、私は知らない。私はこの質問/答え以来、Idrisと遊んでいない。私はhttp://eb.host.cs.st-andrews.ac.uk/drafts/eff-tutorial.pdfにいくつかのアイデアを見ることができます。ここでは、整数が必要な範囲にあり、整数自体と共に_ 。だから私はあなたがフォーマット文字列を解析し、いくつかの 'Format'を持つ証明とそれを返す必要があると思います。 – huynhjl