我只是想知道是否有更好的写作方式:
|> Seq.isEmpty |> not
类似的东西:
|> not Seq.isEmpty
答案 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.isEmpty
,Seq.head
,Seq.skip
等函数,因为它们会破坏懒惰或导致重复枚举序列。
Seq.isEmpty
的原型实现可能就像
let isEmpty (xs : _ seq)=
use en = xs.GetEnumerator()
not <| en.MoveNext()
从中可以明显看出,除了创造(和处置)之外,调查员必须提前一次。如果你发现它非空,那么当你以后使用序列时会重复这种努力。
这可以通过缓存(Seq.cache
)来缓解,但您也可以询问序列是否仍然是手头任务的正确数据结构。