2016-07-27 14 views
6

Jaki jest dobry i działający sposób wykonywania obsady w ten sposób?Wartości krotek seq.cast od obj do string

seq { yield (box "key", box "val") } 
|> Seq.cast<string*string> 

Ponieważ wygląda bardzo brzydki:

seq { yield (box "key", box "val") } 
|> Seq.map (fun (k,v) -> k.ToString(), v.ToString()) 

Jak również to:

seq { yield (box "key", box "val") } 
|> Seq.map (fun (k,v) -> unbox<string>(k), unbox<string>(v)) 

Czy istnieje sposób, aby "unbox" krotka do innego krotki?

+1

po prostu pomóż w funkcji unBoxString (k, v). I możesz wywołać .ToString() bezpośrednio na pudełku. – s952163

+0

dziękuję za sugestię, ale nie mogę nazwać 'ToString()' na pudełkowej krotce, ponieważ dostałbym jej reprezentację smyczkową. I chcę zamiast tego uzyskać krotkę dwóch strun. – derwasp

+0

Tak, oczywiście. Miałem na myśli to, jak w odpowiedzi Marka, gdzie używana jest funkcja ciągu. Musiałbyś wywołać to na każdym pudełkowym obiekcie, który już zrobiłeś. Myślę, że kiedy czuje się "brzydko", łatwo jest napisać jedną linijkę. Posiadanie wielu funkcji pomocniczych jest idiomatyczne. Odpowiedź jest tego dobrym przykładem. – s952163

Odpowiedz

8

można napisać to nieco ładniejszy jak:

seq { yield (box "key", box "val") } 
|> Seq.map (fun (k, v) -> string k, string v) 

Wyobraźmy sobie jednak, że masz Tuple2 moduł:

module Tuple2 = 
    // ... other functions ... 

    let mapBoth f g (x, y) = f x, g y 

    // ... other functions ... 

Z takim mapBoth funkcji, można napisać swoją obsady jako:

seq { yield (box "key", box "val") } |> Seq.map (Tuple2.mapBoth string string) 

Nie ma Tuple2 moduł w FSharp.Core, ale często definiuję jeden w moich projektach, zawierający różne poręczne jednolinijki, takie jak ten powyżej.

+0

'string k, string v' już wygląda trochę lepiej. Ponieważ w moim przypadku jest to tylko skrypt budujący, nie sądzę, bym utworzył moduł do tego, po prostu pójdę z pierwszą sugerowaną opcją. – derwasp

Powiązane problemy