gpt4 book ai didi

OCaml Printf.sprintf

转载 作者:行者123 更新时间:2023-12-04 01:30:44 33 4
gpt4 key购买 nike

为什么会出现这种行为?

# Printf.sprintf ("Foo %d %s") 2 "bar";;
- : string = "Foo 2 bar"

# Printf.sprintf ("Foo %d" ^ " %s") 2 "bar";;
Printf.sprintf ("Foo %d" ^ " %s") 2 "bar";;
Error: This expression has type string but an expression was expected of type
('a -> 'b -> 'c, unit, string) format =
('a -> 'b -> 'c, unit, string, string, string, string) format6

我希望首先评估字符串连接,所以一切都会照常进行。这与 Printf 使用的类型系统技巧有关吗?

最佳答案

是的,它与类型系统技巧有关。如果要创建格式字符串,则需要使用 (^^) 运算符:

# Printf.sprintf ("Foo %d" ^^ " %s") 2 "bar";;
- : string = "Foo 2 bar"

我对这个技巧没有深入的学习,但我相信编译器愿意将字符串常量提升为 printf 格式,如果输入上下文需要它。然而, ("Foo %d" ^ " %s")的结果不是字符串常量,所以它不会得到提升。 (^^) 运算符创建一个类型上下文,如果它们是字符串常量,则可以提升两个操作数。

您可以看到为什么它必须是字符串常量:否则无法确定关联类型(要打印的值)。

关于OCaml Printf.sprintf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406493/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com