任何* else *类似于Haskell的F#中的$而不是< |?

时间:2016-03-25 12:50:18

标签: f#

我知道那里有后管(<|)运算符,在其他几个SO答案中引用。但是当与前向管(|>)结合使用时,这并不能很好地工作,这在链接中很常见。但是,我正在寻找相关的选择。基本上是否有以下功能定义的内置版本?或者这是一个糟糕/危险的做法?

let inline (^%) f = f

let stuff = 
  [1;2;3]
  |> Seq.filter ^% (>) 2
  |> Seq.map ^% fun x -> x.ToString()


// compare to this, which doesn't compile (and would be hard to follow even if it did)
let stuff = 
  [1;2;3]
  |> Seq.filter <| (>) 2
  |> Seq.map <| fun x -> x.ToString()

1 个答案:

答案 0 :(得分:8)

有一些Haskell功能,例如使用反引号的可选 infixing ,以及部分,这些功能在F#中不可用。这使得某些结构更加冗长。

通常,我只是按照以下方式编写一系列函数:

let stuff = 
  [1;2;3]
  |> Seq.filter (fun x -> x < 2)
  |> Seq.map string

在我看来,这更具可读性。例如,使用Seq.filter ^% (>) 2,我直观地读取,意思是“所有值大于2”,但这不是它的作用:

> let inline (^%) f = f;;

val inline ( ^% ) : f:'a -> 'a

> let stuff = 
  [1;2;3]
  |> Seq.filter ^% (>) 2
  |> Seq.map ^% fun x -> x.ToString()
  |> Seq.toList;;

val stuff : string list = ["1"]

如果您让代码的读者对代码的作用存在疑问,那么您只会降低每个人的工作效率。使用Seq.filter (fun x -> x < 2)可能看起来更冗长,但对读者来说是明确的。