Έχουν δημοσιευτεί Σάββατο, 13 Νοεμβρίου 2010 8:24 μμ από το μέλος PALLADIN

Hughes's list in F#

Ορίζοντας τις Combine και Zero σε ένα Computation expression μπορούμε να έχουμε Monoid comprehensions.
Πρόσφατα παρατήρησα ότι το Monadic Append στα γνωστά (Array, List, Seq) είναι σχετικά αργό.

#time
[ for i in {1..1000000} do
        yield i * 2; yield i * 3; yield i * 4; yield i * 5 ]
 
[| for i in {1..1000000} do
        yield i * 2; yield i * 3; yield i * 4; yield i * 5 |]
 
 
seq { for i in {1..1000000} do
        yield i * 2; yield i * 3; yield i * 4; yield i * 5 } |> Seq.iter ignore


Μια τεχνική για να έχουμε γρήγορο list append είναι να αξιοποιήσουμε μια παλαιά ιδέα από έναν guru.

type FuncList<'a> = 'a list -> 'a list

type FuncListBuilder() =
    member self.Combine (first : FuncList<'a>, second : FuncList<'a>) : FuncList<'a>  = (first << second) 
    member self.Zero() : FuncList<'a> = id
    member self.Yield (value : 'a) : FuncList<'a> = fun tail -> value :: tail
    member self.YieldFrom (value : FuncList<'a>) : FuncList<'a> = value
    member self.For (list : FuncList<'a>, f : 'a -> FuncList<'b>) : FuncList<'b> =
        fun tail -> [] |> list |> List.map f |> List.fold (fun acc value -> self.Combine(acc, value)) (self.Zero()) <| tail
    member self.Delay ( f : unit -> FuncList<'a>) : FuncList<'a> = f ()
 
let funcList = new FuncListBuilder()
let toFuncList (list : 'a list) : FuncList<'a> = list |> List.fold (fun acc value -> funcList { yield! acc; yield value }) id


 
[] |> funcList  { for i in toFuncList [1..1000000] do
                    yield i * 2; yield i * 3; yield i * 4; yield i * 5 }

Για περισσότερες πληροφορίες: http://www.cs.tufts.edu/~nr/cs257/archive/john-hughes/lists.pdf


Share


Ενημέρωση για Σχόλια

Αν θα θέλατε να λαμβάνετε ένα e-mail όταν γίνονται ανανεώσεις στο περιεχόμενο αυτής της δημοσίευσης, παρακαλούμε γίνετε συνδρομητής εδώ

Παραμείνετε ενήμεροι στα τελευταία σχόλια με την χρήση του αγαπημένου σας RSS Aggregator και συνδρομή στη Τροφοδοσία RSS με σχόλια

Σχόλια:

Χωρίς Σχόλια

Ποιά είναι η άποψή σας για την παραπάνω δημοσίευση;

(απαιτούμενο)
απαιτούμενο
προαιρετικό
απαιτούμενο
ÅéóÜãåôå ôïí êùäéêü:
CAPTCHA Image