a
|>Seq.map fixLine
|>Seq.map splitCells
|>Seq.map getName
|>Seq.where(fun a->not<|Seq.isEmpty a)
|>Seq.map fixName
Run Code Online (Sandbox Code Playgroud)
总是觉得很烦人,同时保持很多Seq.在线.建议省略它们的好方法......
例如,当我使用seq和列表时,使用List.map列表,仅map用于seq,或将它们拆分为不同的模块.
a
|>map fixLine
|>map splitCells
|>map getName
|>where(fun a->not<|isEmpty a)
|>map fixName
Run Code Online (Sandbox Code Playgroud)
看起来真的好多了
您也可以为所需的函数定义别名:
let map = Seq.map
let where = Seq.filter
Run Code Online (Sandbox Code Playgroud)
或者你可以通过定义自己的运算符来使它变得更加简洁:
let (|!>) s f = Seq.map f s
let (|*>) s f = Seq.filter f s
a
|!> fixLine
|!> splitCells
|!> getName
|*> (fun a->not<|isEmpty a)
|!> fixName
Run Code Online (Sandbox Code Playgroud)
但是在这一点上,你的代码变得过于神秘 - 即看到代码的人将很难理解正在发生的事情.
最后,通过注意maps map的组合是一个组合,你可以使原始代码看起来更好一些:
a
|> Seq.map (fixLine >> splitCells >> getName)
|> Seq.filter (not << isEmpty)
|> Seq.map fixName
Run Code Online (Sandbox Code Playgroud)
这是我个人更喜欢的解决方案.
总的来说,我的个人经验表明,尽管通过使重复部分本身变小来"修复"重复性的第一个冲动,通常有一个更好的解决方案,使您的代码不仅看起来更好,而且更好的因素.