神奇的 sprintf 函数 - 如何包装它?

2024-03-26

我正在尝试接听电话sprintf功能。这是我的尝试:

let p format args = "That was: " + (sprintf format args)

let a = "a"
let b = "b"

let z1 = p "A %s has invalid b" a 

这似乎有效,输出是

val p : format:Printf.StringFormat<('a -> string)> -> args:'a -> string
val a : string = "a"
val b : string = "b"
val z1 : string = "That was: A a has invalid b"

但它不适用于多个参数:

let z2 = p "A %s has invalid b %A" a b

我收到编译时错误:

let z2 = p "A %s has invalid b %A" a b;;
---------^^^^^^^^^^^^^^^^^^^^^^^^^^^

stdin(7,10): error FS0003: This value is not a function and cannot be applied

如何创建一个可以处理任意数量参数的单个函数?

UPD。托马斯建议使用

let p format = Printf.kprintf (fun s -> "This was: " + s) format

它确实有效。这是一个例子

let p format = Printf.kprintf (fun s -> "This was: " + s) format

let a = p "something like %d" 123
// val p : format:Printf.StringFormat<'a,string> -> 'a
// val a : string = "This was: something like 123"

但问题是我的函数的主要目的是做一些除格式化之外的工作,所以我尝试使用建议的代码,如下所示

let q format = 
    let z = p format // p is defined as suggested
    printf z // Some work with formatted string

let z = q "something like %d" 123

并且它不再起作用:

  let z = q "something like %d" 123;;
  ----------^^^^^^^^^^^^^^^^^^^

stdin(30,15): error FS0001: The type ''c -> string' is not compatible with the type 'Printf.TextWriterFormat<('a -> 'b)>'

我该如何解决它?


为此,您需要使用柯里化 - 您的函数p需要采取format并返回由其中之一返回的函数printf函数(可以是带有一个或多个参数的函数)。

这不能使用sprintf(因为那样你就必须显式地传播参数。但是,你可以使用kprintf这需要一个延续作为第一个参数::

let p format = Printf.kprintf (fun s -> "This was: " + s) format

延续是使用格式化字符串调用的,因此您可以在返回之前对结果字符串执行任何您需要的操作。

EDIT:要回答您的扩展问题,诀窍是将所有额外的工作放入延续中:

let q format = 
  let cont z =
    // Some work with formatted string
    printf "%s" z 
  Printf.kprintf cont format 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

神奇的 sprintf 函数 - 如何包装它? 的相关文章

随机推荐

  • 编写 SQL Server 权限脚本

    我想将我对存储过程和其他内容设置的所有权限从开发数据库复制到生产数据库 通过 SSMS GUI 工具手动完成这一切非常麻烦 更不用说容易出错 因此 我正在寻找一种方法 可以直接转储在一个数据库中设置的权限 并将这些相同的权限应用于单独的数据
  • 编辑所有视图和存储过程,查找和替换?

    有没有一种简单的方法可以在我的 SQL Server 数据库中的每个视图和存储过程中查找和替换字符串 我需要将 X United Kingdom 替换为 X UK 您需要查看sysobjects和syscomments 视图和存储过程的文本
  • 如何在 Google Visualization API 中进行多行注释?

    我正在尝试使用谷歌可视化 API 生成带注释的 LineChart 当我让它工作时 我希望能够在可能的情况下使注释具有换行符 不幸的是 Google 的 API 似乎忽略了任何换行信息并将所有内容显示在一行上 有人想出解决这个问题的办法吗
  • R htmlParse XML 中的编码问题

    我尝试抓取网站但无法处理此编码问题 putting together the url search str lt allintitle amphibian richness OR diversity url lt paste http sc
  • 如何在类库中定位EF生成的元文件?

    我已将 Entity Framework 4 模型移至类库 元文件构建到 bin Debug 我用来在类库中定位元文件的连接字符串是什么 我努力了
  • 将多个谓词函数组合为一个

    是否可以编写例如 defn multiple of three n zero mod n 3 defn multiple of five n zero mod n 5 into multiple of three or five 所以我可以
  • Grails 3 Spring Security 预身份验证

    我的应用程序使用 Grails 3 我正在尝试进行预身份验证 如此处所述article https docs spring io spring security site docs 3 0 x reference preauth html
  • 如何检查 Ruby 对象的方法?

    我想知道是否有一个 Ruby 方法调用仅显示由其调用的 Ruby 对象定义的方法 而不是由其祖先类定义的所有方法 这就是methods似乎是这样 methods采用可选的布尔参数 该参数指定是否还列出对象的类及其超类的方法或仅列出对象的单例
  • SQL“之间”不包含在内

    我有一个这样的查询 SELECT FROM Cases WHERE created at BETWEEN 2013 05 01 AND 2013 05 01 但即使 1 日有数据 也没有给出任何结果 created at好像2013 05
  • 使用 SSH 从 BitBucket pip 安装自定义包,无需输入 SSH 密码

    我正在尝试使用pip install git ssh email protected cdn cgi l email protection my org my package repo git从 BitBucket 安装定制的 python
  • PHP MySQL插入多维关联数组从数组键构建查询[重复]

    这个问题在这里已经有答案了 我已经尝试了这两个链接 但我没有得到 fields 和 newdata 中的预期变量内容 这个问题在这里提出了一个新问题 PHP如何从关联数组中提取键名称和值以进行mysql查询 https stackoverf
  • 无法理解递归

    好的 所以我有一个程序 public class Rec public static void main String args test 5 static void test int n if n gt 0 System out prin
  • 如何将 docker-compose 升级到最新版本

    我已经使用命令安装了 docker compose sudo apt install docker compose 它安装了 docker compose 版本 1 8 0 并构建未知 我需要最新版本的 docker compose 或至少
  • 语法错误:JSON.parse:JSON 第 1 行第 2 列出现意外字符

    我需要将此 div 附加到另一个 div 但它给了我这个错误 语法错误 JSON parse 第 1 行第 2 列出现意外字符 JSON 数据 这是我的 JavaScript 代码 var str message message text
  • 使用 RavenDB 的“传统”一对多查询

    我知道include RavenDB 的功能 它允许我在数据库的一次往返中立即获取引用的文档 但我的问题是 我首先获取的文档不包含对 其他 文档的引用 但 其他 文档引用了当前文档 想象一下我们在世界各地都有站点的设置 每个site可能会触
  • FragmentTransaction 不执行任何操作

    我正在学习片段 下面给出的是我的第一个片段程序 一个简单的项目 我有两个屏幕 当我单击第一个屏幕的下一个按钮时 需要显示第二个按钮 我的目标是 Android 2 1 及更高版本使用兼容包 AppMainFragmentActivity j
  • Laravel 查询构建器在查询中使用 AND

    我想在查询生成器的末尾添加一个 AND 子句 代码如下所示 orderers DB table address gt where function query use term query gt where id LIKE term gt
  • 是否可以将 wasm-bindgen 与 webpack 5 一起使用?

    我跟着你好世界 https rustwasm github io docs wasm bindgen examples hello world html Guide for wasm bindgen https crates io crat
  • 在网络应用程序中从网络摄像头或移动摄像头拍照

    我正在开发一个网络应用程序 可以从本地浏览和拍照 而且我想通过相机捕获图像 我使用以下代码 我可以捕获设备相机
  • 神奇的 sprintf 函数 - 如何包装它?

    我正在尝试接听电话sprintf功能 这是我的尝试 let p format args That was sprintf format args let a a let b b let z1 p A s has invalid b a 这似