在 Printf 模块中输入

2023-12-11

在文件中打印模块,不太明白其中的机制('a, out_channel, unit) format,我想我在实践中经常使用它。

例如,以下函数在编译时可以很好地键入:

type t =
  { x: int;
    y: int }

let print (chan: out_channel) (co: t) : unit =
  Printf.fprintf chan "(%d, %d)" x y

let try (co0: t) (co1: t) =
  Printf.fprintf Pervasives.stdout "From %a To %a" print co0 print co1

的签名Printf.fprintf is : out_channel -> ('a, out_channel, unit) format -> 'a,但我不明白什么('a, out_channel, unit) format匹配于"From %a To %a" print co0 print co1.

另外,签名print is out_channel -> t -> unit, 为什么是print co0 print co1代码中可以接受吗?

简而言之,谁能解释一下如何Printf.fprintf Pervasives.stdout "From %a To %a" print co0 print co1已输入?


OCaml 有一个关于格式字符串的打字技巧。这很奇怪,但因其简单且类型安全的 printf 函数而很有用。

通常,字符串文字被输入为字符串:

# "(%d, %d)";;
- : string = "(%d, %d)"

但如果它们具有“格式化”类型上下文,则它们不是:

# ( "(%d, %d)" : (_,_,_) format );;
- : (int -> int -> 'a, 'b, 'a) format = <abstr>

OCaml 类型检查器将文字视为格式字符串,然后对其使用特殊的类型规则:它找到两个%d在那里,并给出一个类型(int -> int -> 'a, 'b, 'a) format这意味着它是一个格式字符串,可以接受 2 个整数并执行某些操作。

将字符串文字与 Printf 函数一起使用可提供相同的“格式”键入上下文,因此“(%d, %d)”不只是作为字符串键入,而是作为以下格式类型键入:

# Printf.fprintf stdout "(%d, %d)";;
- : int -> int -> unit = <fun>

(t1, t2, t3) format大致有以下含义:

  • t1 表示格式字符串作为函数的行为方式:对于此 t1 部分中的某些类型 t,“%d”应该具有“int -> t”,因为它需要一个整数并执行某些操作(主要是打印)。
  • t2 是通道的类型
  • t3 是给定所有格式参数时的最终结果类型。

您可以按如下方式验证:

# (fun x -> Printf.fprintf stdout x, x) "(%d, %d)";;
- : (int -> int -> unit) * (int -> int -> unit, out_channel, unit) format =
(<fun>, <abstr>)

"(%d, %d)"这里使用 2 个整数参数,用于发送一个字符串到 stdout,其类型为out_channel,最后它返回unit.

实际上formattype 只是一个别名format6有 6 个类型参数,这 3 个类型参数用于其他格式字符串输入技巧。但我们不会再继续下去了。

现在对于“%a”。

# ( "%a" : (_, out_channel, unit) format);;
- : ((out_channel -> 'a -> unit) -> 'a -> unit, out_channel, unit) format = <abstr>

这告诉你Printf.fprintf stdout "%a"有两个参数。一个是类型的函数out_channel -> 'a -> unit另一个是'a.

如果你看到这种类型,那么很容易看出Printf.fprintf stdout "%a" print co0类型良好。请注意,它不是Printf.fprintf stdout "%a" (print co0)(这是我看到的时候看错的"%a"第一次是几年前。)

Printf.fprintf stdout "%a" print co0尝试打印co0与打印机print。这个子打印的通道当然是stdout这是给Printf.fprintf.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Printf 模块中输入 的相关文章

随机推荐

  • 如何在CSV文件中同时转义逗号和双引号?

    我正在编写一个 Java 应用程序以将数据从 Oracle 导出到 csv 文件 不幸的是 数据的内容可能相当棘手 逗号仍是分隔符 但行上的某些数据可能如下所示 ID FN LN AGE COMMENT 123 John Smith 39
  • 阻止过期的访问令牌从资源服务器检索数据

    我一直在摆弄 IDS 4 但遇到了一个小问题 我将令牌生命周期设置为大约 15 秒 即使它们已过期 我仍然可以从资源服务器检索日期 如果我从客户端调用的标头中删除令牌 则会收到 401 错误 Client Authorize public
  • 尝试替换数据框中的特定值,但不覆盖它

    我的数据框看起来像这样orders total price amount side 0 0 003019 100 bids 0 0 003143 100 asks 当我尝试通过执行以下操作来替换特定值时 orders total order
  • powershell Get-ChildItem 结果数组

    Get ChildItem File Recurse Path path Fullname返回全名数组 Get ChildItem File Recurse Path path Name返回文件名数组 但 Get ChildItem Fil
  • 进度对话框不出现

    我的活动中有以下内容 我用它来下载用户的 LoveFilm 队列中的电影 但 ProgressDialog 从未出现 public class MyListActivity extends Activity SharedPreference
  • 将字节数组[十六进制]转换为字符数组或字符串类型+ Arduino [重复]

    这个问题在这里已经有答案了 我需要将十六进制字节数组转换为字符串 例如 byte array 4 0xAB 0xCD 0xEF 0x99 array 0 0xAB array 1 0xCD array 2 0xEF array 3 0x99
  • jqGrid拖放接收事件

    我正在使用jqgrid拖放 我有两个表表A和表B 我从表A中拖动一行并放入表B中 我想捕获表中收到的新行ID和数据 是否有任何接收事件在 jqGrid 中 您可以定义ondrop事件函数 参见此Link 像下面这样 jQuery table
  • C++ - thread_local 向量导致 MinGW 上的 join() 崩溃

    include
  • 通过引用返回。返回变量周围的括号

    http php net manual en function return php 通过引用返回时 切勿在返回变量周围使用括号 因为这是行不通的 您只能通过引用返回变量 而不能返回语句的结果 如果使用 return a 那么你返回的不是变
  • 获取 Javascript 中其他位置的偏移量

    我在亚洲 我想计算澳大利亚的偏移量 我知道如何计算偏移量的值 代码如下 var timezone offset new Date getTimezoneOffset 但其他地点如何计算呢 有人可以指导我吗 虽然这can如果要在一个简短的函数
  • 在linux终端中编译c++文件:string_view:没有这样的文件或目录

    我有 gcc Cadence 4 8 3 我想编译一个包含 string view 的 C 文件 当我编译文件时 g script cpp 出现以下错误 script cpp 4 23 fatal error string view No
  • Android - 使用push()插入多个标记

    我可以在地图上插入多个标记 但是 当我插入 Firebase 数据库时 只有最后放置的标记被插入 我想我必须使用某种列表或哈希图 POJO类 public class FirebaseMarker String address String
  • 在 python 脚本中使用 youtube-dl 仅从 youtube 视频下载音频

    有一个few posts on 下载音频来自 YouTube 使用youtube dl 但没有一个是具体的或太有帮助的 我想知道从 Python 脚本中执行此操作的最佳方法是什么 例如 以下是下载视频的 README 示例 import y
  • Python - 沃尔玛的网络抓取

    我正在尝试从中获取一些数据Walmart使用 Python 和 BeautifulSoupbs4 简而言之 我编写了一段代码来获取所有类别名称并且有效 import requests from bs4 import BeautifulSou
  • 启动前为进程设置环境变量

    我有以下情况 我有 Mac OS 捆绑包 其中包含使用一些第三方动态库的应用程序 这些库依赖于一些环境变量 让我们命名它ENV VAR 我想设置ENV VAR仅对我的应用程序具有某些值 因为如果我为整个系统设置它 可能会破坏其他一些应用程序
  • 通过 jQuery 发布数组

    我有一个表单 其中包含一些唯一的输入字段和一些具有重复名称的其他字段 如下所示
  • 如何为 Core Data 中的二进制数据启用外部存储

    我想使用 iOS 5 附带的新的外部二进制数据作为核心数据 我已经看过有关它的文章 例如 http bluecrowbar com blog 2011 08 coredata external html 除了告诉您选中 允许外部存储 框之外
  • 使用 Java 将文本复制到剪贴板

    我想从 a 复制文本JTable的单元格复制到剪贴板 使其可以粘贴到其他程序中 例如 Microsoft Word 我有来自JTable 但我不确定如何将其复制到剪贴板 这对我有用并且非常简单 导入这些 import java awt da
  • 如何检测用户现有订阅的价格是否已更改(Google Play 应用内购买)?

    Google 有文档说明如果订阅价格发生变化该怎么办 您应该使用计费客户端并启动PriceChangeConfirmationFlow 但是 您如何首先检测价格是否发生变化 哪个 Android 库 API 会告诉我这一点 SkuDetai
  • 在 Printf 模块中输入

    在文件中打印模块 不太明白其中的机制 a out channel unit format 我想我在实践中经常使用它 例如 以下函数在编译时可以很好地键入 type t x int y int let print chan out chann