Έχουν δημοσιευτεί
Σάββατο, 13 Νοεμβρίου 2010 8:24 μμ
από το μέλος
PALLADIN
Ορίζοντας τις 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 }