我有这个F#代码无法编译。
let wiql =
"SELECT [State], [Title], [Work Item Type], [ReferenceId]
FROM WorkItems
WHERE [System.TeamProject] = '%s'
AND [Work Item Type] IN ('Product Backlog Item', 'Bug')
AND ([ReferenceId] CONTAINS 'IM' OR [ReferenceId] CONTAINS 'CM' OR [ReferenceId] CONTAINS 'RF')"
let wiql = sprintf wiql projectName
第二个wiql下的红色波浪形的错误是: 类型'string'与'Printf.StringFormat<('a - >'b)>'
类型不兼容我尝试用查询字符串中的projectName替换%s。
感谢您提供有关如何解决此问题的任何提示,
马修
更新:我尝试了一个问题的答案,我的问题是重复的,但我无法让它工作。该示例使用printfn,但是当我使用sprintf尝试相同的操作时,它会失败。我们之间没有看到它们之间存在一些差异。
这是我的F#Interactive会话,用于演示:
> let wiql =
Printf.TextWriterFormat<string -> unit>(
"SELECT [State], [Title], [Work Item Type], [ReferenceId]
FROM WorkItems
WHERE [System.TeamProject] = '%s'
AND [Work Item Type] IN ('Product Backlog Item', 'Bug')
AND ([ReferenceId] CONTAINS 'IM' OR [ReferenceId] CONTAINS 'CM' OR [ReferenceId] CONTAINS 'RF')");;
val wiql : PrintfFormat<(string -> unit),System.IO.TextWriter,unit,unit>
> printfn wiql "DRILQUIP";;
SELECT [State], [Title], [Work Item Type], [ReferenceId]
FROM WorkItems
WHERE [System.TeamProject] = 'DRILQUIP'
AND [Work Item Type] IN ('Product Backlog Item', 'Bug')
AND ([ReferenceId] CONTAINS 'IM' OR [ReferenceId] CONTAINS 'CM' OR [ReferenceId] CONTAINS 'RF')
val it : unit = ()
> let x = sprintf wiql "DRILQUIP";;
let x = sprintf wiql "DRILQUIP";;
----------------^^^^
stdin(19,17): error FS0001: The type 'unit' does not match the type 'System.IO.TextWriter'
我也试过Printf.TextWriterFormat字符串&gt;但那也失败了。
更新: 发现它!
let wiql:Printf.StringFormat<string -> string> = "SELECT [State] FROM WorkItems WHERE [System.TeamProject] = '%s'"
let x = sprintf wiql "DRILQUIP"
printfn "%s" x
使用Printf.StringFormat而不是Printf.TextWriterFormat来准备与sprintf一起使用的格式。如果我理解类型签名字符串&gt;它是一种具有1个可替换字符串占位符并返回字符串的格式。
这也有效。
Printf.StringFormat<_>