[英]make printfn more clear in a function pipeline
所以我把最后一塊放在管子里
|> Array.iter (fun name -> name
|> transform
|> printfn "RENAME '%s' INTO '%s'" name )
轉換為:
let transform (text: string) =
text.Replace(" ", ".")
對我來說, iter
謂詞功能不是很清楚,它說將名稱推入transform
然后將結果推入到printfn
,並附加原始名稱。
有沒有一種方法可以使用管道前向或后向運算符來使轉換管道更具意圖。
我想也許
name
|> printfn "RENAME '%S' INTO '%S'"
<| transform
但這顯然行不通。
如果它在管道中看起來更好,那我想這是最簡潔的方法-除了制作一個將printfn某種方式與轉換結合起來的新功能外,但我不介意避免這種情況...
我只想確保我沒有丟失任何簡單的語法。
我認為沒有,因為我面對的是一個帶有多個參數的函數,為了在正向管道中使用它,它只能有1個參數,這實際上是我通過部分應用程序所做的事情。
有時最好避免不必要的管道傳輸,因為這會混淆代碼。 您的函數僅打印如下:
printfn "RENAME '%s' INTO '%s'" name (transform name)
而且您可以使用<|
省略括號 :
printfn "RENAME '%s' INTO '%s'" name <| transform name
恕我直言,這看起來更好。
也許在這種情況下跳過管道更清晰?
|> Array.iter (fun name -> printfn "RENAME '%s' INTO '%s'" name (transform name))
還要注意,您的原始謂詞可以像這樣進一步組成:
|> Array.iter (transform >> printfn "RENAME '%s' INTO '%s'" name)
如果您希望轉換最后,可以這樣寫:
|> Array.iter ((printfn "RENAME '%s' INTO '%s'" name) << transform)
這是我執行此任務的方式:
let array = [|
"one"
"two"
"three"
|]
let transform s = s, s + "_transformed"
let printIt (n,t) = printfn "RENAME '%s' INTO '%s'" n t
array
|> Array.map transform
|> Array.iter printIt
我的“最佳實踐”告訴我,我總是應該創建和使用函數。 這樣,流(映射和迭代)是恆定的,並且功能或數據可能會更改。
附錄“闡明”為什么要使用功能,什么不可以
let myPipeLineWithPrint t p a=
a
|> Array.map t
|> Array.iter p
//"Old" Version With above data
myPipeLineWithPrint transform printIt array
type SomeRecord = {
Name: string
MoreStuff: string
}
type OtherRecord = {
NewName: string
OldName: string
}
let array2 = [|
{Name="one"; MoreStuff="dontcare"}
{Name="two"; MoreStuff="dontcare"}
{Name="three"; MoreStuff="dontcare"}
|]
let transform2 {Name=n; MoreStuff=ms} = transform n
myPipeLineWithPrint transform2 printIt array2
let transform3 {Name=n; MoreStuff=_} =
let (_,nn) = transform n
{NewName= nn; OldName=n}
let printIt2 {NewName=nn; OldName = o} = printfn "RENAME '%s' INTO '%s'" o nn
myPipeLineWithPrint transform3 printIt2 array2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.