簡體   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