在函数管道中使printfn更清晰

时间:2016-11-23 14:11:38

标签: f#

所以我最后一件在管道中

|> 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部分申请。

3 个答案:

答案 0 :(得分:4)

有时最好避免不必要的管道,因为它可能会混淆代码。 您的功能只是打印如下:

printfn "RENAME '%s' INTO '%s'" name (transform name)

您可以使用<|

来省略parens
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