F# printfn 异常

标签 f#

谁能解释一下为什么这会导致错误:

let xs = [| "Mary"; "Mungo"; "Midge" |]

Array.iter printfn xs

虽然不是这样:

Array.iter printfn [| "Mary"; "Mungo"; "Midge" |]

最佳答案

printfn 的签名是Printf.TextWriterFormat<'a> -> 'a .编译器将字符串的文字值推断为 Printf.TextWriterFormat<unit>但不能使用动态字符串。

您可以通过添加正确的类型注释来帮助第一个示例中的编译器:

let xs: Printf.TextWriterFormat<unit> [] = [| "Mary"; "Mungo"; "Midge" |]
Array.iter printfn xs

或使用显式构造函数:

let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter (fun s -> printfn <| Printf.TextWriterFormat<unit>(s)) xs

一般来说,这样做太冗长了。因此,指定格式字符串如 "%s"对于字符串和 "%O"对于覆盖 ToString() 的类型方法是最好的方法:

let xs = [| "Mary"; "Mungo"; "Midge" |]
Array.iter (printfn "%s") xs

关于F# printfn 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708229/

相关文章:

f# - 取消 F# 异步工作流的子 block

f# - 如何在我自己的代码中生成类似于 FSI 的 F# 类型签名?

javascript - 他们在 fsharp 文档中使用的 javascript 库是什么

haskell - 如何让非法值(value)观无法代表?

api - Twitter 流 api 与 F# 中的代理

.net - 获取模式匹配中可区分联合的大小写标识符

F# 交互服务 : how to pass in . 来自主机的 NET 对象

c# - 加载包含作为通配符的项的 .NET 项目

f# - 构造仅用于计算表达式

algorithm - 这个 put 实现如何与 q 而不是 p 一起工作