我想写一个带输入的函数是一个字符串列表,输出是一个字符串。 例如 : 清单:
3 11 12
15 13 14 15
输出:
(assert
(and (= (+ x11 x12) 3)
(= (+ x13 x14 x15) 15)
))
我写的代码:
let print data =
printf "(assert \n(and ";
List.iter (fun l ->
let str = "(=(+" in
str ^ "x" ^(String.concat "x" (List.tl l)) ^ ")" ^ (List.hd l) ^ ")\n";
printf str;
) data;
printf "))";
;;
但它没有用。编译时,显示错误
请帮我修理一下。 非常感谢你
答案 0 :(得分:1)
我看到三个问题。
Printf
模块printf
的情况下使用 open Printf
。也许它是在其他地方完成的,因为显然你没有粘贴整个代码。学会提出好问题。
printf
printf str
在OCaml中的输入不是很好。这对新手来说非常困惑。 OCaml的printf
试图模仿C的printf行为,为此目的,它的输入有点奇怪。要告诉它很短但有点不准确,规则是:
printf
必须以常量形式获取其格式字符串参数。或者你有麻烦。
在您的代码中,printf "(assert \n(and "
和printf "))"
是正常的,因为它们会获得字符串常量,但printf str
不是。这是一个变量。
简单的解决方法是使用print_string
代替printf
:
print_string str
应该有效。 printf
很棘手,但我想我不应该再往前走了。如果您想了解更多内容,有关于OCaml printf
在SO中输入的几个QA,例如:OCaml Printf.sprintf
假设printf
的上述输入问题已通过print_string
替换来解决。
我们仍然收到警告"警告10:此表达式应具有类型单位。"在提问者尝试修改str ^ "x" ^..
的字符串连接str
周围,但这是错误的。
首先,请注意,此表达式不会修改str
的内容。它通过连接str
和其他字符串来创建新字符串。这个新字符串未被使用,只是在代码中被丢弃,这就是我们收到警告的原因。 str
未更改,因此输出将与其不同。警告10是这种错误的一个很好的指示,因此你不应该忽略它。
如果您要打印新字符串,则必须将其提供给print_string
(原始代码中为printf
)您应该写:
let str' = str ^ "x" ^(String.concat "x" (List.tl l)) ^ ")" ^ (List.hd l) ^ ")\n" in
print_string str'
或者,只是
print_string (str ^ "x" ^(String.concat "x" (List.tl l)) ^ ")" ^ (List.hd l) ^ ")\n")