memoizeMonadic seems to be quite restrictive(only accept IdentifyBuilder).
not sure what you want to achieve
not sure what you want to achieve
Good point.
I was trying to something like "Monadic Memoization Mixins" (but without the mix-in concept) ([link:www.cs.utexas.edu]).
But maybe I need to try it on a monad that does something.
I was trying to something like "Monadic Memoization Mixins" (but without the mix-in concept) ([link:www.cs.utexas.edu]).
But maybe I need to try it on a monad that does something.
A bit further reading leads me to believe that if I want my memoization to to be held by the state of the monad and if I also want to support recursion, I want to write continuation and state monad that are compatible. I'll post that when it works.
Here the stateless monadic memoization code. I based it on the state continuation monad, the code is inspired from this posting [link:www.mail-archive.com]
Trying to understand how this monad works, I found this work on monadic reflection by A. Filinsky ([link:www.cs.ioc.ee] It is very interesting.
(By the way, can someone tell me how to post code so that it is readable? )
Trying to understand how this monad works, I found this work on monadic reflection by A. Filinsky ([link:www.cs.ioc.ee] It is very interesting.
(By the way, can someone tell me how to post code so that it is readable? )
type csm<'s,'m,'w> = 's -> ('s -> 'm -> 'w) -> 'w
let ret a = fun s k -> k s a
let bind a f = fun s k -> a s (fun s2 b -> (f b) s2 k)
let get = fun (s:'s) k -> k s s // ret s
let set v = fun _ k -> k v ()
let runCS m = fun s0 -> m s0 (fun _ v -> v)
let runCS2 m = fun s0 -> m s0 (fun s v -> (s,v))
// I don't know if this is correct
let CallCC f =
(fun s0 ka -> f (fun a -> (fun s1 kb -> kb a s1) s0 ka))
type CSBuilder() =
member b.Bind(m,f) = bind m f
member b.Return(x) = ret x
let memoize f x =
bind get (fun (omap:Map<_,_> option) ->
let computeAndAdd (toMap:Map<_,_>) =
bind (f x) (fun v ->
bind (set (Some (toMap.Add(x,v)))) (fun() ->
ret v
))
match omap with
| Some map ->
let d = map.TryFind x
match d with
| None ->
computeAndAdd map
| Some v ->
ret v
| None ->
computeAndAdd Map.empty
)
let csm = new CSBuilder()
let plus1 x = csm { return x+1 }
let mplus1 = memoize2 plus1
let plus x =
csm {
let! rs = mplus1 x
let! r = mplus1 rs
return r
}
let plusplus x =
csm {
let! y= plus x
let! z= plus x
return z
}
do
let (map, r) = runCS2 (plusplus 4) None
printf "%A" map
System.Console.ReadLine() |> ignore
(By the way, can someone tell me how to post code so that it is readable? )
I've seen this question a bit lately, so I posted this:
[link:cs.hubfs.net]
Topic tags
- f# × 3660
- compiler × 263
- functional × 199
- c# × 119
- websharper × 114
- classes × 96
- web × 94
- book × 84
- .net × 82
- async × 72
- parallel × 43
- server × 43
- parsing × 41
- testing × 41
- asynchronous × 30
- monad × 28
- ocaml × 26
- tutorial × 26
- haskell × 25
- workflows × 22
- html × 21
- linq × 21
- introduction × 19
- silverlight × 19
- wpf × 19
- fpish × 18
- collections × 14
- pipeline × 14
- templates × 12
- monads × 11
- opinion × 10
- reactive × 10
- plugin × 9
- scheme × 9
- sitelets × 9
- solid × 9
- basics × 8
- concurrent × 8
- deployment × 8
- how-to × 8
- python × 8
- complexity × 7
- javascript × 6
- jquery × 6
- lisp × 6
- real-world × 6
- workshop × 6
- xaml × 6
- conference × 5
- dsl × 5
- java × 5
- metaprogramming × 5
- ml × 5
- scala × 5
- visual studio × 5
- formlets × 4
- fsi × 4
- lift × 4
- sql × 4
- teaching × 4
- alt.net × 3
- aml × 3
- enhancement × 3
- list × 3
- reflection × 3
- blog × 2
- compilation × 2
- computation expressions × 2
- corporate × 2
- courses × 2
- cufp × 2
- enterprise × 2
- entity framework × 2
- erlang × 2
- events × 2
- f# interactive × 2
- fsc × 2
- google maps × 2
- html5 × 2
- http × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- keynote × 2
- mvc × 2
- numeric × 2
- obfuscation × 2
- oop × 2
- packaging × 2
- pattern matching × 2
- pipelines × 2
- rx × 2
- script × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- type × 2
- type provider × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- addin × 1
- agents × 1
- agile × 1
- android × 1
- anonymous object × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net mvc × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- b-tree × 1
- bistro × 1
- bug × 1
- camtasia studio × 1
- canvas × 1
- class × 1
- client × 1
- clojure × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- combinator × 1
- confirm × 1
- constructor × 1
- continuation-passing style × 1
- coords × 1
- coursera × 1
- csla × 1
- css × 1
- data × 1
- database × 1
- declarative × 1
- delete × 1
- dhtmlx × 1
- discriminated union × 1
- distance × 1
- docs × 1
- documentation × 1
- dol × 1
- domain × 1
- du × 1
- duf-101 × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- error × 1
- etw × 1
- euclidean × 1
- event × 1
- example × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- fantomas × 1
- fear × 1
- float × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- function × 1
- functional style × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- google × 1
- group × 1
- hash × 1
- history × 1
- hosting × 1
- httpcontext × 1
- https × 1
- hubfs × 1
- ie 8 × 1
- if-doc × 1
- inheritance × 1
- installer × 1
- interpreter × 1
- io × 1
- ios × 1
- ipad × 1
- kendo × 1
- learning × 1
- licensing × 1
- macro × 1
- macros × 1
- maps × 1
- markup × 1
- marshal × 1
- math × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- multidimensional × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- nested × 1
- nested loops × 1
- node × 1
- object relation mapper × 1
- object-oriented × 1
- offline × 1
- option × 1
- orm × 1
- osx × 1
- owin × 1
- paper × 1
- parameter × 1
- performance × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- programming × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- ptvs × 1
- quant × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- real-time × 1
- reference × 1
- restful × 1
- round table × 1
- runtime × 1
- scriptcs × 1
- scripting × 1
- service × 1
- session-state × 1
- sitelet × 1
- stickynotes × 1
- stress × 1
- strong name × 1
- structures × 1
- tdd × 1
- template × 1
- tracing × 1
- tsunamiide × 1
- type inference × 1
- type providers × 1
- upload × 1
- vb × 1
- vb.net × 1
- vector × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio shell × 1
- visualstudio × 1
- web api × 1
- webapi × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- xml × 1
|
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us |
Built with WebSharper |
Below I took the identity monad from Matt's posting under [link:cs.hubfs.net]
My question: is this the right way to memoize while working with monads?
type Identity<'a> = (unit -> 'a) let id x = (fun () -> x) : Identity<'a> let runIdentity (m : Identity<'a>) = m() let bind m (f: 'a -> Identity<'b>) = f (runIdentity m) let delay f = (fun () -> runIdentity (f ())) type IdentityBuilder() = member b.Bind(m,f) = bind m f member b.Delay(f) = delay f member b.Let(x,f) : Identity<'a> = f x member b.Return(x) = id x let identity = new IdentityBuilder() let memoize (cache: Map<_,_> ref) f = fun x -> match (!cache).TryFind(x) with | Some res -> res | None -> let res = f x cache := (!cache).Add(x,res) res let memoizeMonadic (monad:IdentityBuilder) cache f = memoize cache (fun x-> monad {return f x}) let square_monad = let cache = ref Map.empty memoizeMonadic identity cache (fun x-> x*x) let plus3_monad = let cache = ref Map.empty memoizeMonadic identity cache (fun x-> x+3) let square_plus3_monad x = identity { let! rs = square_monad x let! r = plus3_monad rs return r } do let result1 = runIdentity (square_plus3_monad 4) let result2 = runIdentity (square_plus3_monad 4) printfn "%A" result1 |> ignore; printfn "%A" result2 |> ignore; System.Console.ReadLine() |> ignore