F# 使函数管道中的printfn更清晰

F# 使函数管道中的printfn更清晰,f#,F#,我把最后一块放在管子里 |> Array.iter (fun name -> name |> transform |> printfn "RENAME '%s' INTO '%s'" name ) 转换是: let transform (text: string) = text.Replace(" ", ".") 对我来说,it

我把最后一块放在管子里

|> 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“将“%S”重命名为“%S”

也许在这种情况下跳过管道更清楚

|> 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)

|>Array.iter((printfn“将“%s”重命名为“%s”名称)在这种情况下跳过管道可能更清楚

|> 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)

|>Array.iter((printfn“将'%s'重命名为'%s'名称)有时最好避免不必要的管道,因为它会混淆代码。
您的函数只需打印如下内容:

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

您可以通过使用
省略paren,有时最好避免不必要的管道,因为它会混淆代码。
您的函数只需打印如下内容:

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

您可以使用
省略parens这就是我执行此任务的方式:

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

这就是我完成这项任务的方式:

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

好了,最后一个表达式看起来很好。很明显,我遗漏了一些东西。最后两个(合成词)不正确,因为上下文中不存在
name
(缺少
fun name->
部分。这导致合成词不能在那里使用(原样)因为我们不止一次需要这个参数,最后一个表达式看起来很好。很明显,我遗漏了一些东西最后两个(合成的那个)是不正确的,因为上下文中不存在
name
(缺少
fun name->
部分。这导致合成不能在那里使用(原样)由于不止一次需要参数,最后一个表达式是否会在
Array.iter
然后
Array.iter(有趣的名称->
和主体旁边,是的,最后一个表达式是否会在
Array.iter
然后
Array.iter旁边(有趣的名字->
和正文,是的,我很感谢花时间提供这个答案,但是,我很难从我的问题中看出这个答案。你能再详细一点吗,例如
s,s+“\u”
这是做什么的?我已经运行了它,它确实提供了所需的输出,但是我确实觉得这有点抽象,我确实提到过可以通过重构函数来实现这一点,但我想尝试让
printfn
与管道保持内联,如果这有意义的话?@Callumlington重点是这可能很简单现在。如果你想在以后的某个时间更改内容,并更改数据在管道中的定义或处理方式,或者数据的打印方式,那么你可能有好几个地方可以打印,这是一件好事,而且确实有功能。很可能管道是正常的,但是什么数据正在通过它,以及它是如何通过的打印的数据实际上是在变化的。是的,我用(可能解释得不好)来预防我的问题事实上,我有点想避开这种重用,主要是因为我首先只关注语言运算符和语法。@Callumlington我更新了我的答案,试图让它更清楚如何/什么/为什么/在哪里…希望它至少有帮助;-)我很感激花了这么多时间来提供这个答案,但是我很难从我的问题中看出答案。你能再详细解释一下吗,例如
s,s+“\u”
这是做什么的?我已经运行了它,它确实提供了所需的输出,但是我确实觉得这有点抽象,我确实提到过可以通过重构函数来实现这一点,但我想尝试让
printfn
与管道保持内联,如果这有意义的话?@Callumlington重点是这可能很简单现在。如果你想在以后的某个时间更改内容,并更改数据在管道中的定义或处理方式,或者数据的打印方式,那么你可能有好几个地方可以打印,这是一件好事,而且确实有功能。很可能管道是正常的,但是什么数据正在通过它,以及它是如何通过的打印的数据实际上是在变化的。是的,我用(可能解释得不好)来预防我的问题事实上,我有点想避开这种重用,主要是因为我首先只关注语言运算符和语法。@Callumlington我更新了我的答案,试图让它更清楚如何/什么/为什么/在哪里…希望它至少有帮助;-)