繁体   English   中英

"Hello" |> printfn 在 F# 中生成错误

[英]"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 (即,没有代表formatf )只取一个简单的字符串: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM