[英]"Hello" |> printfn generates an error in F#
https://tryfsharp.fsbolero.io/
printfn "Hello"
但是,使用 pipe 运算符按预期工作,没有错误
"Hello" |> printfn
“字符串”类型与“Printf.TextWriterFormat”类型不兼容
我了解 pipe 操作员行为:
f(a)
等价于a |> f
为什么后者会产生错误? 谢谢。
是的。 pipe 运算符按照您的想法执行。 但是, printfn
是“特殊的”,它采用一种“可格式化的字符串”(有不同的类型),并且编译器只有在格式字符串作为直接参数出现时才会发挥作用。
换句话说,第一个示例中的"Hello"
并不是真正的字符串,它是由编译器神奇地创建的Printf.TextWriterFormat
object。
不过,您可以通过使用显式格式字符串来做您想做的事情。 这种方法你会在现实世界的代码中看到很多:
"Hello" |> printfn "%s"
在这里, %s
意思是:给我一个字符串。 在这种情况下,F# 的魔力再次采用格式字符串,这里"%s"
,这次使用string
类型的参数,并将其转换为 function。
注意1:正在考虑这种“惊喜效应”,社区致力于添加一个printn
function (即,没有代表format
的f
)只取一个简单的字符串: https://github.com/fsharp/fslang -建议/问题/1092
注意 2:如果您确实想将 arguments 传递给printfn
,则可以使类型显式,但很少这样做:
let x = Printf.TextWriterFormat<unit> "Hello"
x |> printfn // now it's legal
注意 3:您可能想知道为什么编译器也不将其魔法应用于|>
的 lh 侧。 原因是|>
不是编译器固有的,而只是另一个可覆盖的运算符。 因此,解决这个问题在技术上非常困难(左侧可以有任意数量的运算符),尽管在某些时候已经考虑过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.