#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/4o2. @Stephen: Только что заметил фрагмент через Twitter :-). Хороший и полезный пример! Спасибо за публикацию.
Ответ №2:
Ради вывода типа, то, что у вас есть, скорее всего, лучший способ сделать это. Это позволяет функции 'a -> unit
знать тип, 'a
потому что seq<'a>
он задается первым (и вывод типа выполняется сверху вниз / слева направо). Вы можете изменить выражение несколькими различными способами, но ни один из них не сохранит нажатия клавиш и может оказаться более неудобным.