所以我最后一件在管道中
|> 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个参数,这实际上就是我所说的#39 ; m部分申请。
答案 0 :(得分:4)
有时最好避免不必要的管道,因为它可能会混淆代码。 您的功能只是打印如下:
printfn "RENAME '%s' INTO '%s'" name (transform name)
您可以使用<|
printfn "RENAME '%s' INTO '%s'" name <| transform name
这看起来更好恕我直言。
答案 1 :(得分:2)
在这种情况下,跳过管道可能更清楚了吗?
|> 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)
答案 2 :(得分:1)
这就是我将如何完成这项任务:
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
我的“最佳实践”告诉我,我总是应该创建和使用函数。这样,流(map和iter)是恒定的,函数或数据可能会改变。
“澄清”为什么要使用功能而不是
的附录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