我怎样才能最好地创建一个函数(我们称之为 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/