F# 将 sprintf 应用于字符串列表

标签 f# recursion functional-programming

我怎样才能最好地创建一个函数(我们称之为 myPrint),该函数将 sprintf、一个格式字符串和一个字符串列表作为参数并产生一个结果,以便将字符串列表中的每个元素应用/折叠到 sprintf ?

myPrint (sprintf "one: %s two: %s three: %s") ["first"; "second"; "third"];;

会产生输出

val myPrint : string = "one: first two: second three: third"

最佳答案

请注意,F# 中的格式字符串专门设计为采用静态已知数量的参数,因此没有一种特别优雅的方式来执行您想要的操作。但是,这样的事情应该可以工作:

let rec myPrintHelper<'a> (fmt:string) : string list -> 'a = function
| [] -> sprintf (Printf.StringFormat<_>(fmt))
| s::rest -> myPrintHelper<string -> 'a> fmt rest s

let myPrint fmt = myPrintHelper<string> fmt

myPrint "one: %s two: %s three: %s" ["first"; "second"; "third"]

如果您的字符串中 "%s"es 的数量与列表中的字符串数量不匹配,这将在运行时引发异常。

关于F# 将 sprintf 应用于字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4861823/

相关文章:

python - F# 字典初始化就像在 Python 中一样

f# - 为什么 FSharp.Data.SqlClient 记录作为对象公开?

f# - 如何在 `for .. in` 中对联合构造函数进行模式匹配

javascript - 替代模型是否适用于闭包?或者你需要一个环境模型?

scala - Scala习惯用法,用于通过多个条件进行排序

python - lambda self : do 是什么意思

f# - Array.Parallel 的“MaxDegreeOfParallelism”?

arrays - 到达某一点所需的最少步数

java - 是否有更好的方法来分析作为示例给出的输入/输出数组之间的路径?

c - 你如何使用递归从右边遍历来打印数组中的偶数?