sprintf和格式的F#错误

时间:2014-12-11 22:33:37

标签: f# f#-interactive f#-3.0 f#-3.1

我使用资源文件作为字符串,然后也使用占位符和需要格式化字符串。

我的项目中有(以下)以下代码:

let create s = sprintf (Printf.StringFormat<_>(s)) 

let formatstring = "%s:%d" // this is actually then gotten from the resource strings

let createsomespecificstring s d = create formatstring s d  

let resultstring = createsomespecificstring "123" 123

当我使用f#3.0时,此代码有效。交换它以使用3.1编译它,它编译但产生运行时错误:

  

无法转换类型&#39; Final2 @ 235 [Microsoft.FSharp.Core.Unit,System.String,System.String,System.String,System.String]&#39;键入&#39; Microsoft.FSharp.Core.FSharpFunc 2[Microsoft.FSharp.Core.FSharpFunc 2 [Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.PrintfImpl + PrintfEnv 3[Microsoft.FSharp.Core.Unit,System.String,System.String]],Microsoft.FSharp.Core.FSharpFunc 2 [System.String,Microsoft。 FSharp.Core.FSharpFunc`2 [System.String,System.Object的]]]&#39;

如果我在repl中运行上面的代码,它根本不起作用:

  

stdin(28,5):错误FS0030:值限制。值&#39;结果字符串&#39;已被推断为具有泛型类型      val resultstring:&#39; _a
  定义&#39; resultstring&#39;作为一个简单的数据术语,使其成为具有显式参数的函数,或者,如果您不打算将其作为通用函数,则添加类型注释。

上面的代码在某种程度上违背了强类型的目的,但是当有一个资源字符串时它就很好了。

我做错了什么(除了上面提到的)?

关于如何做得更好甚至使其有效的任何想法(特别是在3.1中)?

修改 在第一个答案(在该特定情况下有效)之后,格式化选项/参数的数量是&#34;随机的&#34;长度:

let formatstring = "%s:%d:%d"
let createsomespecificstring s d d'  = create formatstring s d d'
let resultstring = createsomespecificstring "123" 123 345

然后它再次无效。

2 个答案:

答案 0 :(得分:1)

键入注释为@kvp提示是&#34;正确&#34;答案。

let createsomespecificstring s d d' : string = create formatstring s d d'

在fsi和f#3.1中根据我已经完成的测试进行编译。

答案 1 :(得分:0)

这是一个至少在fsi中起作用的解决方案:

let create s = sprintf (Printf.StringFormat<_ -> _ -> string >(s)) 
let formatstring = "%s:%d" // this is actually then gotten from the resource strings
let createsomespecificstring s d = create formatstring s d
let resultstring = createsomespecificstring "123" 123

我需要的只是添加一些额外的伪参数,并强制将sprintf的返回类型作为字符串。