在python中,可以使用“%”运算符格式化printf:
"i am %d years old" % 99
或
"%s is %d years old" % ("bob", 101)
对于任意数量的参数,有没有办法在Ocaml中获得相同的简洁语法?
对于单个参数,以下方法有效:
let (%) = Printf.sprintf in ... "i am %d years old" % 99
有没有一种方法适用于任意数量的参数?
答案 0 :(得分:8)
这取决于你的意思是任意数量的论点:
我不相信有一种方法可以在OCaml中编写一个函数来接受并解包一个任意arity的元组(例如,(1, "bob")
和{{ 1}})。
处理多个参数的Caml方法是通过元组而不是,而是通过currying。如果您愿意这样做,那么您可以使用("joe", "bob", "briggs")
。
如果你真的想要一个中缀运算符,例如
Printf.sprintf
然后你运气不好,因为函数应用程序比任何中缀运算符都更紧密。你可以写
"%s-%s %s is the best movie reviewer" % "joe" "bob" "briggs"
但对我而言似乎并非如此 - 而不是你正在寻找的机器人。
所以如果你的问题是:
我可以在Objective Caml中定义一个 infix 版本的
("%s-%s %s is the best movie reviewer" % "joe") "bob" "briggs"
,它接受任意数量的参数吗?
答案是否。
答案 1 :(得分:1)
理论上,使用格式生成(typ1 * typ2 * ... * typn) -> string
类型而不是typ1 -> typ2 -> ... -> typn -> string
似乎并不困难。也许,除了递归格式%( fmt %)
之外。有人真的使用那些吗?
但实际上,OCaml实现者选择了后一种形式,并为该形式实现了类型系统黑客,而不是前者。所以我担心的答案是,如果没有修补编译器,你就会遇到格式字符串替换的curried形式。
答案 2 :(得分:0)
这听起来像是Camlp4的工作!
答案 3 :(得分:0)
你可以用前缀op代替infix:
let (!%) = Printf.sprintf
如果你只想简单地编写sprintf,那就足够了。
正如Tobu所说,如果你想让Python像特殊语法那样需要P4。我认为它必须太复杂。