2016-02-24 34 views
6
a 
|>Seq.map fixLine 
|>Seq.map splitCells 
|>Seq.map getName 
|>Seq.where(fun a->not<|Seq.isEmpty a) 
|>Seq.map fixName 

Zawsze irytujące, podczas gdy zachowaj wiele z Seq. w liniach. Zaproponuj dobry sposób na ich pominięcie ...Jakikolwiek sposób na "otwórz Seq" lub podobny efekt?

Na przykład użyj List.map dla list, użyj tylko map dla seq lub podziel je na różne moduły, gdy używam seq i list.

a 
|>map fixLine 
|>map splitCells 
|>map getName 
|>where(fun a->not<|isEmpty a) 
|>map fixName 

Wygląda naprawdę lepiej.

+1

Spróbowałeś? Nie działa, ale komunikat o błędzie wyraźnie wskazuje, dlaczego moduł jest celowo przypisywany atrybutem [RequireQualifiedAccess]. – kvb

+1

Jeśli odwołasz się do [FSharpPlus] (https://github.com/gmpl/FSharpPlus), twój kod będzie działał. Wystarczy wpisać "filter" zamiast "where". Będzie działał tak samo z tablicami i listami, w zależności od typu 'a'. – Gustavo

Odpowiedz

6

Można też po prostu zdefiniować skróty do funkcji, które mają:

let map = Seq.map 
let where = Seq.filter 

Lub może jeszcze bardziej zwięźle zdefiniować własne operatory:

let (|!>) s f = Seq.map f s 
let (|*>) s f = Seq.filter f s 

a 
|!> fixLine 
|!> splitCells 
|!> getName 
|*> (fun a->not<|isEmpty a) 
|!> fixName 

Ale w tym momencie twój kod staje się zbyt tajemniczy - np. Ktoś, kto patrzy na kod, będzie miał trudności ze zrozumieniem, co się dzieje.

I wreszcie, można zrobić oryginalny kod wyglądać nieco lepiej zauważyć, że kompozycja map s jest map składu:

a 
|> Seq.map (fixLine >> splitCells >> getName) 
|> Seq.filter (not << isEmpty) 
|> Seq.map fixName 

Jest to rozwiązanie, które ja osobiście wolałby.


Ogólnie moje osobiste doświadczenie pokazuje, że mimo pierwszego impulsu do „naprawić” powtarzalności poprzez powtarzające się same części mniejsze, istnieje zwykle lepszym rozwiązaniem, które pozwoliłoby kod nie tylko patrzeć lepsze, ale również lepsze.

+0

Wow, mam sposób na użycie operatora "' >> ", dziękuję! –

+0

Jeśli którakolwiek z dwóch odpowiedzi ci pomogła, czy chciałbyś "zaakceptować" jedną z nich? –

+0

Rozumiem, sugeruję, że to nie jest ostateczna odpowiedź, ale jest pomocna. –

4

Nie sądzę, że istnieje łatwy sposób na uniknięcie powtarzania Seq - jest to tylko jedno miejsce, w którym F # sprawia, że ​​rzeczy są bardziej wyraźne (dzięki czemu wiesz, co się dzieje).

Ale można użyć F# Core Fluent library który daje bardziej C# -Jak składni z .:

a.map(fixLine).map(splitCells).map(getName).filter(isEmpty >> not).map(fixName) 
+0

Wielkie dzięki za terminową odpowiedź! –