Есть ли имена FP для оператора, который направляет операцию во внутреннюю структуру? (аналогично оператору |> в fsharp) - PullRequest
0 голосов
/ 01 марта 2012

Мне нужно было написать 2 оператора:

let inline (|/>) (seqinit:seq<'a*'T>) f = seqinit |> Seq.map  (fun (key1 ,seq1) -> (key1, seq1 |> f ))
let inline (||>) (seqinit:seq<'a * seq<'b>>) (f2:seq<'b>->seq<'c*seq<'d>>) = seqinit |>  Seq.map  (fun (key1 ,seq1) -> (key1, seq1 |> f2 ))

Чтобы выполнить следующие операции: первая группа преобразует Seq в Map, вторая группа добавляет ключ в коллекцию

let toMap  (seqinit:seq<'a*'T>)                 =  seqinit |/> id     |> Map.ofSeq  
let toMap2 (seqinit:seq<'a*seq<'b*'T>>)         =  seqinit |/> toMap  |> toMap
let toMap3 (seqinit:seq<'a*seq<'b*seq<'c*'T>>>) =  seqinit |/> toMap2 |> toMap


let groupBy2 f1 f2 (seqinit:seq<'a>) = 
  seqinit |> Seq.groupBy f1  ||> (Seq.groupBy f2)

let groupBy3 f1 f2 f3 (seqinit:seq<'a>) =
  seqinit |> Seq.groupBy f1  ||> (Seq.groupBy f2) ||> (Seq.groupBy f3)

Есть ли какое-либо специальное имя для этих 2 операторов | /> и ||>?

Это поможет мне найти другие такие операторы и не будет изобретать колесо

РЕДАКТИРОВАТЬ

это также полезно для разгруппировки

let ungroup  (seqinit:seq<'a*seq<'b>>)                 = seqinit |> Seq.fold(fun state (key, keyseq) -> Seq.append state keyseq) Seq.empty
let ungroup2 (seqinit:seq<'a*seq<'b*seq<'c>>>)         = seqinit |/> ungroup |> ungroup
let ungroup3 (seqinit:seq<'a*seq<'b*seq<'c*seq<'d>>>>) = seqinit |/> ungroup |/> ungroup |> ungroup

1 Ответ

1 голос
/ 01 марта 2012

||> уже определено в FSharp.Core как 'T1 * 'T2 -> ('T1 -> 'T2 -> 'U) -> 'U. Использование: (arg1, arg2) ||> func. Его скомпилированное имя op_PipeRight2.

Ваше определение |/> кажется слишком настроенным для общего использования, поэтому я предполагаю, что для него нет предопределенного имени.

...