所有这些都从一个简单的想法开始:如何在ocaml中编写python样式的格式化字符串。OCaml问题:如何用pythonic方法构造一个对齐的字符串
pythoners可以初始化字符串为:
str = "this var: %s" % this_var
str2 = "this: %s; that: %s" % (this_var, that_var)
但ocaml的按照以下格式的字符串代码:
let str = Printf.sprintf "this var: %s" this_var
let str2 = Printf.sprintf "this: %s; that: %s" this_var that_var
我相信我能做某事使OCaml的字符串格式化代码蟒蛇般 在首先,我定义了如下功能:
let (%) s x = Printf.sprintf s x
然后,我可以直接写为:
let str = "this: %s" % "sth"
但简单的功能不能处理更复杂的情况是两个或多个变量。 所以我想写一个复杂的函数来使它完全模拟Python的方式。 我写如下:
let (%) s li =
let split_list = Str.full_split (regexp "%[a-z]") s in
let rec fmt result_str s_list x_list = match s_list with
| [] -> result_str
| shd::stl -> match shd with
| Text t -> fmt (result_str^t) stl x_list
| Delim d -> match x_list with
| [] -> fmt result_str stl []
| xhd::xtl -> fmt (result_str^(Printf.sprintf d xhd)) stl xtl
in
fmt "" split_list li
但功能只是不能工作,因为类型的错误,也ocaml的名单不能包含多种类型。 如果你写这样的话:"name: %s; age: %d" % ["John"; 20]
ocaml编译器的世界笑的代码,并告诉你一些类型的错误。
显然,我必须用Tuple来替换List。但我不知道如何对可变长度元组进行尾递归。
欢迎任何建议。我确实有两个问题。
- 如何编写pythonic ocaml代码来格式化字符串。
如果Ocaml不能动态生成一些字符串作为format6 str和 将它传递给sprintf?下面的代码:
令S = “%s” 表示Printf.sprintf的 “你好”
会产生错误信息为:
Error: This expression has type string but an expression was expected of type ('a -> 'b, unit, string) format = ('a -> 'b, unit, string, string, string, string) format6
绕过类型系统不是一个好主意。它导致程序崩溃或以其他方式行事。 – Gilles 2011-11-13 17:40:40
“如果我们绕过打字系统......”,那么使用C或其他一些没有数学建立的碰撞保护的语言会更好。但你的研究是彻底的。 – 2015-10-21 17:13:16