Cayenne

が、まずAgdaに先立つんじゃないかと思ったので、遠回りながらCayenneからやっています。


で、Cayenneの面白さはHaskell(少なくともfunctional language)を知っているのと、型理論とかにある程度以上明るいと良いのですが、私は前者はなんとかなってるとして後者がちんぷんかんぷんなのでやれやれ困ったものですという感じで。


Cayenneのページ
http://www.cs.chalmers.se/~augustss/cayenne/


で、tarボール開いた後にmake && make installするわけですが、ちょっと手を加えないといけない所とかが在りつつも上手く導入しました。



取りあえずこれがCayenneっぽいコードを論文から。
http://www.cs.chalmers.se/~augustss/cayenne/paper.ps

PrintfType :: String -> # -- #はtype of type
PrintfType "" = String 
PrintfType ('%':'d':cs) = Int -> PrintfType cs 
PrintfType ('%':'s':cs) = String -> PrintfType cs 
PrintfType ('%': _ :cs) = PrintfType cs 
PrintfType ( _ : cs) = PrintfType cs 

printf :: (fmt::String) -> PrintfType fmt
printf fmt = pr fmt ""


pr :: (fmt::String) -> String -> PrintfType fmt

pr ""           res = res
pr ('%':'d':cs) res = \(i:Int) -> pr cs (res ++ show i)
pr ('%':'s':cs) res = \(s:String) -> pr cs (res ++ s)
pr ('%':c:cs)   res = pr cs (res ++ [c])
pr (c:cs)       res = pr cs (res ++ [c])

Cayenneのコード

Cayenneでは"型"がfirst class typeです。


printf,prを同じ感じでHaskellで書こうと思うと結構骨が折れます。