更好的方式''|> Seq.isEmpty |>不'

时间:2015-11-27 11:20:26

标签: f#

我只是想知道是否有更好的写作方式:

|> Seq.isEmpty |> not

类似的东西:

|> not Seq.isEmpty

3 个答案:

答案 0 :(得分:5)

也许你喜欢?

|> (not << Seq.isEmpty)

答案 1 :(得分:2)

我可能会选择你现在拥有的东西。这取决于上下文 - 当这是一些较大函数的结果时,我认为以下看起来很好:

let someFunction () = 
  someData
  |> Some pipeline
  |> Seq.isEmpty
  |> not

如果我在其他上下文中写这个,我很可能会定义一个局部变量并写下这样的东西:

let local =    
  someData
  |> Some pipeline
if not (Seq.isEmpty local) then 
  printfn "Not empty!"

@ Carsten的回答中的想法也很好,但我有点担心,对于那些不熟悉这种编码模式的人来说,这看起来很奇怪。在我看来,了解那里发生的事情并不容易。

答案 2 :(得分:0)

我不会说。相反,尝试避免使用Seq.isEmptySeq.headSeq.skip等函数,因为它们会破坏懒惰或导致重复枚举序列。 Seq.isEmpty的原型实现可能就像

let isEmpty (xs : _ seq)=
    use en = xs.GetEnumerator()
    not <| en.MoveNext()
从中可以明显看出,除了创造(和处置)之外,调查员必须提前一次。如果你发现它非空,那么当你以后使用序列时会重复这种努力。

这可以通过缓存(Seq.cache)来缓解,但您也可以询问序列是否仍然是手头任务的正确数据结构。