字符串修改时的错误和OCaml中的`printf`

时间:2015-01-20 02:34:20

标签: string ocaml

我想写一个带输入的函数是一个字符串列表,输出是一个字符串。 例如 : 清单:

   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 "))";
;;

但它没有用。编译时,显示错误

请帮我修理一下。 非常感谢你

1 个答案:

答案 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")