后向合成算子(<<)
定义为:
( << ) : ('b -> 'c) -> ('a -> 'b) -> 'a -> 'c`
应用两个谓词,它实际上是一个函数,它获取初始值,'a
返回值'c
,而值在'b
内部处理。
从您提供的代码示例中,让我假设您需要将参数应用于两个谓词。做这件事有很多种方法:
丢弃(第一个)谓词返回的值,而是返回原始参数。WebSharper 中存在这样的运算符:
let ( |>! ) x f = f x; x
// Usage:
let ret =
x
|>! f1
|>! f2
|> f3
我喜欢这种方法,因为:
- 它不会使事情复杂化;每个函数应用都是原子的,代码看起来更易读;
- 它允许在三个或更多谓词中进行链接,就像上面的例子一样;
在这种情况下,f
必须返回unit
,但您可以轻松解决此问题:
let ( |>!! ) x f = ignore(f x); x
将参数应用于两个谓词,返回结果元组,与您自己的示例完全相同。有这样的算子OCaml,很容易适应F#:
val (&&&) : ('a -> 'b) -> ('a -> 'c) -> 'a -> 'b * 'c
正如@JackP 所注意到的,&&&
已经在 F# 中为其他目的定义了,所以让我们使用另一个名称:
/// Applying two functions to the same argument.
let (.&.) f g x = (f x, g x)
// Usage
let ret1, ret2 =
x
|> (f .&. g)
注意上面的示例是针对函数应用的直接顺序。如果您需要以相反的顺序应用它们,则需要相应地修改代码。