Могу ли я избежать скобок на Seq.iter? - PullRequest
0 голосов
/ 26 апреля 2011

Или действительно я могу избежать скобок с такими операциями:

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

Так что я хочу знать, возможно ли сделать какой-то трюк с одинаковыми трубами или нет. Я уже пробовал это разными способами, но знаю, что хочу вернуться к нему и спросить, может быть, я могу сделать это, используя что-то вроде | |

X |> Seq.iter <| fun x ->

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Конечно, вы можете написать:

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 голос
/ 26 апреля 2011

Ради вывода типа, то, что у вас есть, скорее всего, лучший способ сделать это. Это позволяет функции 'a -> unit знать тип 'a, потому что сначала задается seq<'a> (и вывод типа работает сверху вниз / слева направо). Вы можете изменить выражение несколькими различными способами, но ни один из них не спасет нажатия клавиш и может оказаться более неловким.

...