Могу ли я избежать скобок в Seq.iter?

#f# #pipe

#f# #канал

Вопрос:

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

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

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

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

Комментарии:

1. Почему вы хотите это сделать? <| такое же количество символов, как () ?

2. Я думаю, приоритет оператора -> немного слишком низок…

3. Я бы просто использовал именованную функцию. X |> Seq.iter f

4. Единственный случай, когда я счел полезным использовать |> и <| в одном и том же выражении, — это при вызове defaultArg .

5. Я хочу это, потому что мне не нравятся скобки)

Ответ №1:

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

 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. Томас, ты только что подал мне идею использовать ^ для создания правоассоциативного обратного канала, let inline (^<|) f a = f a . Для этого тоже создал свой первый сниппит: fssnip.net/4o

2. @Stephen: Только что заметил фрагмент через Twitter :-). Хороший и полезный пример! Спасибо за публикацию.

Ответ №2:

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