这个问题很相似: F#管道第一个参数
我目前正在学习F#和函数式编程,我想知道是否有一种简单的方法来管道转发第一个参数(而不是最后一个参数).
例如,如果我想管道最后一个参数,它看起来非常漂亮和干净:
[4;5;6]
|> List.append [1;2;3]
// Result: [1;2;3;4;5;6]
Run Code Online (Sandbox Code Playgroud)
如果我想管道转发第一个参数,我可以使用"有趣的x - >"函数,但我很好奇是否有更简洁的方法.
[1;2;3]
|> fun x -> List.append x [4;5;6]
// Result: [1;2;3;4;5;6]
Run Code Online (Sandbox Code Playgroud)
非常感谢你.
PS我的同事刚刚帮我解决了这个问题.但如果您对F#初学者有任何建议,我将不胜感激.谢谢.
Fyo*_*kin 10
当参数的顺序不方便时,您总是可以转换函数本身,使其以不同的顺序获取参数:
let flip f x y = f y x
[1; 2; 3]
|> (flip List.append) [4; 5; 6]
Run Code Online (Sandbox Code Playgroud)
转换函数在许多情况下都很有用.它是功能性程序员的面包和黄油.
但最后,我相信,可读性是最重要的:程序的阅读速度比编写时更加频繁.当我发现自己处于类似的情况,并且我不想因为某些原因命名中间值或使用lambda表达式时,我自己定义了一个直观易懂的函数:
let prependTo a b = List.append b a
[1; 2; 3]
|> prependTo [4; 5; 6]
Run Code Online (Sandbox Code Playgroud)
所有现有的答案都能很好地解决问题.
但是,我认为如果你想使用管道指定函数的第一个参数,大多数时候,这不是一个好主意,你应该只使用没有管道的普通调用:
List.append [1;2;3] [4;5;6]
Run Code Online (Sandbox Code Playgroud)
原因是"管道模式"允许您编写对某些数据结构(列表等)执行一系列转换的代码.设计用于支持管道模式的库将"主输入"作为支持管道的最后一个参数.
如果你输入的参数不是最后一个,那就意味着你打破了这种规律性,所以你不再通过一系列转换传递一个数据结构.这将使您的代码混乱,因为"它看起来像一个管道,但它不是真正的管道".
当然,情况并非总是如此,并且在某些情况下您需要这样做,但根据经验,我只会在适合时使用管道.
| 归档时间: |
|
| 查看次数: |
1230 次 |
| 最近记录: |