如何理解OCaml中Printf.printf的类型?
理解OCaml中Printf.printf的类型
先看OCaml里Printf.printf的基础类型:
Printf.printf ;; - : ('a, out_channel, unit) format -> 'a = <fun>
这个类型是OCaml多态格式函数的典型写法,咱们拆成两部分理解:
1. ('a, out_channel, unit) format:格式字符串的类型参数
这是OCaml内置的format类型的实例,三个参数各有作用:
- 第一个参数
'a:代表printf接收完所有格式占位符对应参数后的最终形态——可能是一个等待接收参数的函数,也可能是最终的返回值unit - 第二个参数
out_channel:指定输出的目标通道,默认是标准输出stdout,这也是printf默认往控制台输出的原因 - 第三个参数
unit:表示当所有参数都传入、输出操作完成后,最终返回的类型是unit(也就是())
2. 结合具体例子看类型推导
咱们用你提到的两个例子验证:
- 当传入格式字符串
"%s"时,OCaml会推导这个字符串对应的format类型是(string -> unit, out_channel, unit) format。所以Printf.printf接收它后,返回的类型就是string -> unit——意思是还需要传一个string参数,传完后执行输出,最终返回unit - 当传入
"%n"时,对应的format类型是(int -> unit, out_channel, unit) format,所以printf返回int -> unit,需要再传一个int参数才会完成输出 - 如果是无占位符的字符串,比如
"hello world",对应的format类型是(unit, out_channel, unit) format,所以printf直接返回unit,调用后立刻输出内容,返回()
简单来说,Printf.printf的类型是根据格式字符串动态调整的多态函数:格式里有多少个占位符,就会生成对应需要多少个参数的函数,所有参数传完后执行输出,最终返回unit。
内容的提问来源于stack exchange,提问作者zell
相关产品推荐
相关产品推荐

