我可以避免Seq.iter上的括号吗?

时间:2011-04-26 14:07:52

标签: f# pipe

或者我真的可以避免使用这样的操作括号:

X |> Seq.iter(fun x -> () ) 

所以我想知道是否可以用管道做一些技巧。我已经用不同的方式尝试了它但是知道我想要回到它并且问我可以使用类似| |

之类的东西来做
X |> Seq.iter <| fun x ->

2 个答案:

答案 0 :(得分:3)

当然,你可以写:

for x in X do ()

好的,这不是你要求的,但序列表达式和for通常是表达管道的语法上更简单的方法。

回到你的问题 - <|不起作用(对于更长的管道)的原因是它的优先级太低(因为它首先有不同的目的)。您需要一些优先级高于|>的运算符,以便正确解析代码。你可以写例如:

let (+<) f a = f a

[1..10] |> Seq.map +< fun x -> x * x
        |> Seq.iter +< fun x -> printfn "%A" x

但实际上,在实践中使用它并不是一个好主意,因为它不会为你节省任何打字,而且会混淆其他读取代码的F#程序员(与使用$时的Haskell不同)。

答案 1 :(得分:1)

为了进行类型推断,你拥有的东西很可能是最好的方法。它允许函数'a -> unit知道'a的类型,因为首先给出seq<'a>(类型推断从上到下/从左到右)。您可以通过几种不同的方式重新排列表达式,但没有一种方法可以节省击键次数,并且可能会更加尴尬。