Thanks Don,
I read some parts of the paper again, it turns out, on page 7 they mention that 'Observables' are very similar to "Fran's behaviours" from "Functional reactive animation" by Elliot and Hudak (1997). That paper didn't have what I wanted, but another paper, "Functional Reactive programming from First Principles" by Wan and Hudak (2000) has the following definition on page four:
1
type Behavior a = [Time] -> ['a'] //without quotes, this forum inserts a smiley if i don't put in the quotes
so I wrote the following in F# (after consulting #ocaml on irc):
1
type 'a obs = date list -> 'a list //definition of Observable
Following is my code now (there are several syntax errors, and I haven't touched the function to actually value these instruments, but here goes):
----------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
// How to write a financial contract (Peyton Jones and Eber) // Shahbaz Chaudhary // Mon Aug 07, 2006 //Mon Aug 9, 2006: changed the observable definition after advice from Don Syme // and "Functional Reactive programming from First Principles" by Wan and Hudak (2000) //blah blah type date = System.DateTime type currency = string //This should perhaps be an enumertion of all currency codes rather than a raw string //Contract definition type Contract = | Zero | One of currency | Give of Contract | And of Contract * Contract | Or of Contract * Contract | Cond of bool obs * Contract * Contract | Scale of float obs * Contract | When of bool obs * Contract | Anytime of bool obs * Contract | Until of bool obs * Contract //Observable definition type 'a obs = date list -> 'a list //Observable primitives let konst a = a obs let lift f o = f o //how does it know that 'o' is an observable? type it explicitly? let lift2 f o1 o2 = f o1 o2 //same type problem let date = date obs //Random Variable type 'a rv = 'a list //is this right? random variable is a list of possible value of type 'a? //Value Process type 'a pr = date-> 'a rv //Process primitives let k x = fun dt -> x //for any date value, 'x' is returned...how does it know that 'fun dt ...' is actually a value process ('a pr)? let processdate = date pr //? let cond b pr1 pr2 = if b then pr1 else pr2 //type //for lift and lift2 of process, use the same functions as observable primitives? let (+) pr1 pr2 = pr1 + pr2 //*, /, >, <, =, ... let x = "USD" //how does it know that "USD" is actually of type currency? type it explicitly? let c1 = Give Zero
If any one is still following this thread, I cleaned up the existing code a little. I've been trying to get through some Fran and FRP papers to understand this stuff better. The book "Haskell School of Expression" has a good chapter on reactive animation, it was fairly helpful. The lift functions for 'process' are not getting typed correctly. The code follows:
------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
type date =Date of System.DateTime type currency = string //This should perhaps be an enumertion of all currency codes rather than a raw string //Observable definition type 'a obs = Obs of (date -> 'a) //Contract definition type Contract = | Zero | One of currency | Give of Contract | And of Contract * Contract | Or of Contract * Contract | Cond of bool obs * Contract * Contract | Scale of float obs * Contract | When of bool obs * Contract | Anytime of bool obs * Contract | Until of bool obs * Contract //Observable primitives let konst a = Obs (fun t -> a) let lift1 f (Obs o) = Obs (fun t-> f (o t)) let lift2 f (Obs o1) (Obs o2) =Obs (fun t-> f (o1 t) (o2 t)) let date =Obs (fun t-> t) //Random Variable type 'a rv =RV of 'a list //is this right? random variable is a list of possible value of type 'a? //Value Process type 'a pr =PR of (date-> 'a rv) //Process primitives let k x = PR (fun t -> RV [x]) let procdate = PR (fun t ->RV [t]) let proclift1 (f:'a->'b) (PR a) = PR (fun t-> f (a t)) ///from this point on the code doesn't seem to work, 'f' wants to operate on 'a rv instead of primitives values let proclift2 f (PR a) (PR b) = PR (fun t-> f (a t) (b t)) let proclift3 f (PR a) (PR b) (PR c) = PR (fun t-> f (a t) (b t) (c t)) let procif b a c = if(b) then a else c //let procif2 = proclift3 procif let a =k 1 let b = a 1 let c = List.map (fun x -> x+1) a let x = "USD" //how does it know that "USD" is actually of type currency? type it explicitly? let c1 = Give Zero
Hi,
For what it's worth, an (extended?) OCaml port of the said paper was developped, see [link:www.lexifi.com]
[link:www.lexifi.com] is the most comprehensive file from the resources of the site ( [link:www.lexifi.com] ) although there are some other presentations.
Hopefully it can give you some ideas.
Julien,
Thanks for the link. The material on their site is mostly marketing, that is to say nothing technical (and since I am using the "Contracts" paper as a learning excercise, I need a lot more detail :) ).
By the way, if it isn't already obvious, lexifi doesn't need to worry about competition from the few lines of code I post here :)
Hi guys,
Normally, I would have hopped in on this one, but things have been a bit crazy. Let me take another look at this thread. I agree with Don, i.e. there is a good topic here and F# works based on this topic would provide a great example for others.
I can't promise time to contribute code right at the moment, but I will at least offer a few ideas.
I've seen a few opinions on these ideas and the corresponding research and haven't had time to become informed.
---O
Hi all,
here's my 2 pence contribution . I let aside the random variables & Stochastic process for the moment.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
open System type date =Date of System.DateTime type currency = USD |EUR |JPY |GBP //currency is maybe better with be an enumeration of all currency codes rather than a raw string //Observable definition type 'a obs = Obs of (date -> 'a) //Contract definition (I just added some of the other "combinators" from the contract-icfp.ps working paper) type Contract = | Zero | One of currency | Give of Contract | And of Contract * Contract | Or of Contract * Contract | Truncate of date * Contract | Then of Contract * Contract | Scale of float obs * Contract | Get of Contract | Anytime of Contract | Cond of bool obs * Contract * Contract | When of bool obs * Contract | Until of bool obs * Contract //Observable primitives let konst a = Obs (fun t -> a) let lift1 f (Obs o) = Obs (fun t-> f (o t)) let lift2 f (Obs o1) (Obs o2) =Obs (fun t-> f (o1 t) (o2 t)) let add_obs = lift2 (+.) ;; //Addition on float Obs let minus_obs = lift2 (-.) let mult_obs = lift2 ( *.) let div_obs = lift2 ( /.) let date = Obs (fun t-> t) let TempInParis = Obs(fun t -> 9.7);; // first order approx :-) let TempInParisinKelvin = add_obs TempInParis (konst 273.);; let scaleK x c = Scale ((konst x), c) let zcb t x k = scaleK x (Get(Truncate(t,(One k)))) //Zero Coupon Bond let perhaps t u = Truncate(t , (Or(u,Zero))) let european t u = Get(perhaps t u) //European option let american (t1,t2) u = let opt = Anytime(perhaps t2 u) in Then(Get(Truncate(t1,opt)),opt) let oneBuck = One USD;; let hundredBucks = Scale((konst 100.),oneBuck);; let GiltStrip = zcb (Date(new System.DateTime(2007,5,10))) 100. GBP;;
Regards
Julien
Thanks Julien,
I'm glad to see I wasn't wildly off the mark. Following are a few more lines of code starting at the "from this point on the code doesn't seem to work..." comment:
1 2 3 4 5 6 7 8 9
let proclift1 f (PR a) = PR (fun t-> List.map f (a t)) let proclift2 f (PR a) (PR b) = PR (fun t->List.map2 f (a t) (b t)) let proclift3 f (PR a) (PR b) (PR c) = PR (fun t->map3 f (a t) (b t) (c t)) let procif b a c = if (b) then a else c //won't this evaluate both 'a' AND 'c' due to eager evaluation??? let procif2 b a c = proclift3 procif b a c //Additional process primitives (dependent on valuation model) let exch currencyTo currencyFrom = currencyTo * currencyFrom //garbage for now
A few thoughts : shouldn't an observable be more general : a constant observable doesn't depend on time :
1
let (f : Observable<DateTime -> int>) = fun time -> time.DayOfWeek
seems a bit more logical than having to define your constant as
1
let (foo : Observable<int>) = (fun _ : DateTime)-> 12345
An idea from the lexifi presentation I mentioned is the use of the Either combinator :
1 2 3
type Contract = | ... | Either of list<Contract> (* of which Or is an abbreviation *)
The American option definition (from the icfp paper) is odd. Aside from the date of acquisition, there are no two dates in an american option definition. Unless they were thinking of the acquisition date, but then : why not in the European case? Not sure to get their idea here... An American option is an option that you can exercise anytime between the acquisition date and the expiration date. So the first definition of the paper : Anytime (perhaps expDate payoff) ought to be right....
In his paper, Eber mentions Acquire : bool observable -> Contract -> Contract as a function that returns a contract as soon as the bool observable is true. It seems like a good idea. Rather than using get(truncate t1 c), you'd have acquire (t=t1) c, or something in this vein... More straightforward, and more human-readable.
For the american option (I suppose) you would get :
1 2
let americanOption acqDate expirationDate payoffFunction = acquire {acqDate} (Anytime (perhaps expDate payoff))
As for exchange rates, couldn't we have something like ?
1
let exchange_rate cur1 cur2 = And (one c1, give (one c2))
julien.
Hi falcon,
I think it would be excellent to work through a high-quality implementation of this work in F#.
I took a brief look at the paper today and the datatype approach seems the right one for the "Contract" type. I'm not so sure if that's the case for "Observable" - that feels more like it would be best to prototype with that being a concrete type.
In general, wherever Haskell type classes are used you will probably need to pass around dictionaries of operations explicitly (where dictionaries of operations are represented by records of function values), or else make the types concrete. For example, either make "Observable" a concrete type (some representation of the time-varying data whichb allows you to implement Lift, Lift2, Date etc., e.g. time series data). Later you can pass around a dictionary of operations that manipulates abstract Observable values, though in any particular application your representation of observables will probably be fixed.
I'd be glad to take a longer look with you tomorrow - and perhaps Julien and optionsScalper would like to join in ? :-)
don
Topic tags
- f# × 3705
- websharper × 1897
- compiler × 286
- functional × 201
- ui next × 139
- c# × 121
- classes × 97
- web × 97
- .net × 84
- book × 84
- async × 76
- ui.next × 67
- bug × 54
- core × 49
- website × 49
- server × 45
- parallel × 43
- ui × 43
- enhancement × 41
- parsing × 41
- testing × 41
- trywebsharper × 41
- typescript × 37
- html × 35
- javascript × 35
- owin × 35
- asynchronous × 30
- monad × 28
- ocaml × 28
- tutorial × 27
- warp × 27
- haskell × 26
- sitelet × 25
- linq × 22
- workflows × 22
- wpf × 20
- fpish × 19
- introduction × 19
- silverlight × 19
- sitelets × 19
- monodevelop × 17
- rpc × 17
- suave × 17
- piglets × 16
- collections × 15
- feature request × 15
- jquery × 15
- templates × 15
- getting started × 14
- pipeline × 14
- kendoui × 13
- reactive × 12
- 4.1.0.171 × 11
- monads × 11
- opinion × 10
- 4.0.190.100-rc × 9
- deployment × 9
- fixed × 9
- formlets × 9
- in × 9
- json × 9
- plugin × 9
- proposal × 9
- scheme × 9
- solid × 9
- basics × 8
- concurrent × 8
- highcharts × 8
- how-to × 8
- python × 8
- 4.1.1.175 × 7
- complexity × 7
- documentation × 7
- visual studio × 7
- 4.1.2.178 × 6
- lisp × 6
- real-world × 6
- released in 4.0.192.103-rc × 6
- remoting × 6
- resources × 6
- scala × 6
- websharper ui.next × 6
- workshop × 6
- xaml × 6
- 4.0.193.110 × 5
- 4.2.3.236 × 5
- aspnetmvc × 5
- authentication × 5
- azure × 5
- bootstrap × 5
- conference × 5
- dsl × 5
- formlet × 5
- java × 5
- list × 5
- metaprogramming × 5
- ml × 5
- released in Zafir.4.0.188.91-beta10 × 5
- sql × 5
- visualstudio × 5
- websharper.forms × 5
- zafir × 5
- 4.0.192.106 × 4
- 4.0.195.127 × 4
- 4.1.0.38 × 4
- 4.2.1.86 × 4
- 4.2.6.118 × 4
- css × 4
- example × 4
- extensions × 4
- fsi × 4
- fsx × 4
- html5 × 4
- jqueryui × 4
- lift × 4
- reflection × 4
- remote × 4
- rest × 4
- spa × 4
- teaching × 4
- template × 4
- websocket × 4
- wontfix × 4
- 4.0.196.147 × 3
- 4.1.0.34 × 3
- 4.1.6.207 × 3
- 4.2.1.223-beta × 3
- 4.2.11.258 × 3
- 4.2.4.114 × 3
- 4.2.4.247 × 3
- 4.2.5.115 × 3
- 4.2.6.253 × 3
- 4.2.9.256 × 3
- ajax × 3
- alt.net × 3
- aml × 3
- asp.net mvc × 3
- canvas × 3
- cloudsharper × 3
- compilation × 3
- database × 3
- erlang × 3
- events × 3
- extension × 3
- file upload × 3
- forums × 3
- inline × 3
- issue × 3
- kendo × 3
- macro × 3
- mono × 3
- msbuild × 3
- mvc × 3
- pattern × 3
- piglet × 3
- released in Zafir.4.0.187.90-beta10 × 3
- svg × 3
- type provider × 3
- view × 3
- 4.1.1.64 × 2
- 4.1.5.203 × 2
- 4.1.7.232 × 2
- 4.2.10.257 × 2
- 4.2.3.111 × 2
- 4.2.5.249 × 2
- android × 2
- asp.net × 2
- beginner × 2
- blog × 2
- chart × 2
- client × 2
- client server app × 2
- clojure × 2
- computation expressions × 2
- constructor × 2
- corporate × 2
- courses × 2
- cufp × 2
- d3 × 2
- debugging × 2
- direct × 2
- discriminated union × 2
- docs × 2
- elm × 2
- endpoint × 2
- endpoints × 2
- enterprise × 2
- entity framework × 2
- event × 2
- f# interactive × 2
- fable × 2
- flowlet × 2
- formdata × 2
- forms × 2
- fsc × 2
- google maps × 2
- hosting × 2
- http × 2
- https × 2
- iis 8.0 × 2
- install × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- jquery mobile × 2
- keynote × 2
- lens × 2
- lenses × 2
- linux × 2
- listmodel × 2
- mac × 2
- numeric × 2
- oauth × 2
- obfuscation × 2
- offline × 2
- oop × 2
- osx × 2
- packaging × 2
- pattern matching × 2
- performance × 2
- pipelines × 2
- q&a × 2
- quotation × 2
- reference × 2
- released in Zafir.4.0.185.88-beta10 × 2
- rx × 2
- script × 2
- security × 2
- self host × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- tutorials × 2
- type × 2
- url × 2
- var × 2
- websharper.charting × 2
- websharper4 × 2
- websockets × 2
- wig × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- 4.0.194.126 × 1
- 4.1.3.184 × 1
- 4.1.4.189 × 1
- 4.2.0.214-beta × 1
- 4.2.12.259 × 1
- 4.2.2.231-beta × 1
- 4.2.8.255 × 1
- Canvas Sample Example × 1
- DynamicStyle Animated Style × 1
- Fixed in 4.0.190.100-rc × 1
- Released in Zafir.UI.Next.4.0.169.79-beta10 × 1
- SvgDynamicAttribute × 1
- WebComponent × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- actor × 1
- addin × 1
- agents × 1
- aggregation × 1
- agile × 1
- alter session × 1
- animation × 1
- anonymous object × 1
- apache × 1
- api × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net core × 1
- asp.net integration × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- attributes × 1
- authorization × 1
- b-tree × 1
- back button × 1
- badimageformatexception × 1
- bash script × 1
- batching × 1
- binding-vars × 1
- bistro × 1
- body × 1
- bundle × 1
- camtasia studio × 1
- cas protocol × 1
- charts × 1
- clarity × 1
- class × 1
- cli × 1
- clipboard × 1
- clojurescript × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- color zones × 1
- combinator × 1
- combinators × 1
- compile × 1
- compile code on server × 1
- config × 1
- confirm × 1
- content × 1
- context × 1
- context.usersession × 1
- continuation-passing style × 1
- coords × 1
- cordova × 1
- cors × 1
- coursera × 1
- cross-domain × 1
- csla × 1
- current_schema × 1
- custom content × 1
- data × 1
- data grid × 1
- datetime × 1
- debug × 1
- declarative × 1
- delete × 1
- devexpress × 1
- dhtmlx × 1
- dictionary × 1
- directattribute × 1
- disqus × 1
- distance × 1
- do binding × 1
- doc elt ui.next upgrade × 1
- docker × 1
- dojo × 1
- dol × 1
- dom × 1
- domain × 1
- du × 1
- duf-101 × 1
- dynamic × 1
- eastern language × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- enums × 1
- error × 1
- etw × 1
- euclidean × 1
- eventhandlerlist × 1
- examples × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- failed to translate × 1
- fake × 1
- fantomas × 1
- fear × 1
- float × 1
- form × 1
- form-data × 1
- forum × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- fsunit × 1
- function × 1
- functional style × 1
- game × 1
- games × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- getting-started × 1
- google × 1
- google.maps × 1
- grid × 1
- group × 1
- guide × 1
- hash × 1
- headers × 1
- hello world example × 1
- heroku × 1
- highchart × 1
- history × 1
- how to × 1
- html-templating × 1
- http405 × 1
- httpcontext × 1
- hubfs × 1
- i18n × 1
- ie 8 × 1
- if-doc × 1
- iis × 1
- image × 1
- images × 1
- inheritance × 1
- initialize × 1
- input × 1
- install "visual studio" × 1
- installer × 1
- int64 × 1
- interfaces × 1
- internet explorer × 1
- interop × 1
- interpreter × 1
- io × 1
- iobservable × 1
- ios × 1
- iot × 1
- ipad × 1
- isomorphic × 1
- javascript optimization × 1
- javascript semanticui resources × 1
- jquery-plugin × 1
- jquery-ui × 1
- jquery-ui-datepicker × 1
- js × 1
- kendo datasource × 1
- kendochart × 1
- kendoui compiler × 1
- knockout × 1
- l10n × 1
- learning × 1
- library × 1
- libs × 1
- license × 1
- licensing × 1
- lineserieszonescfg × 1
- local setting × 1
- localization × 1
- logging × 1
- loop × 1
- macros × 1
- mailboxprocessor × 1
- mapping × 1
- maps × 1
- markerclusterer × 1
- markup × 1
- marshal × 1
- math × 1
- mathjax × 1
- message × 1
- message passing × 1
- message-passing × 1
- meta × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- mix × 1
- mobile installation × 1
- mod_mono × 1
- modal × 1
- module × 1
- mouseevent × 1
- mouseposition × 1
- multidimensional × 1
- multiline × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- native × 1
- nested × 1
- nested loops × 1
- node × 1
- nunit × 1
- object relation mapper × 1
- object-oriented × 1
- om × 1
- onboarding × 1
- onclick × 1
- optimization × 1
- option × 1
- orm × 1
- os x × 1
- output-path × 1
- override × 1
- paper × 1
- parameter × 1
- persistence × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- post × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- privacy × 1
- private × 1
- profile × 1
- programming × 1
- project × 1
- project euler × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- proxy × 1
- ptvs × 1
- public × 1
- pure f# × 1
- purescript × 1
- qna × 1
- quant × 1
- query sitelet × 1
- question × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- reactjs × 1
- real-time × 1
- ref × 1
- region × 1
- released in 4.0.190.100-rc × 1
- reporting × 1
- responsive design × 1
- rest api × 1
- rest sitelet × 1
- restful × 1
- round table × 1
- router × 1
- routing × 1
- rpc reverseproxy × 1
- runtime × 1
- sales × 1
- sample × 1
- sampleapp × 1
- scriptcs × 1
- scripting × 1
- search × 1
- self hosted × 1
- semanticui × 1
- sequence × 1
- serialisation × 1
- service × 1
- session-state × 1
- sharepoint × 1
- signals × 1
- sitelet website × 1
- sitelet.protect × 1
- sitlets × 1
- slickgrid × 1
- source code × 1
- sqlentityconnection × 1
- ssl × 1
- standards × 1
- static content × 1
- stickynotes × 1
- streamreader × 1
- stress × 1
- strong name × 1
- structures × 1
- submitbutton × 1
- subscribe × 1
- svg example html5 websharper.ui.next × 1
- sweetalert × 1
- system.datetime × 1
- system.reflection.targetinvocationexception × 1
- table storage × 1
- targets × 1
- tdd × 1
- templates ui.next × 1
- templating × 1
- text parsing × 1
- three.js × 1
- time travel × 1
- tls × 1
- tooltip × 1
- tracing × 1
- tsunamiide × 1
- turkish × 1
- twitter-bootstrap × 1
- type erasure × 1
- type inference × 1
- type providers × 1
- type-providers × 1
- typeprovider × 1
- ui next forms × 1
- ui-next × 1
- ui.next jqueryui × 1
- ui.next charting × 1
- ui.next formlets × 1
- ui.next forms × 1
- ui.next suave visualstudio × 1
- ui.next templating × 1
- unicode × 1
- unittest client × 1
- upload × 1
- usersession × 1
- validation × 1
- vb × 1
- vb.net × 1
- vector × 1
- view.map × 1
- visal studio × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio shell × 1
- vs2017 compiler zafir × 1
- vsix × 1
- web api × 1
- web-scraping × 1
- webapi × 1
- webcomponents × 1
- webforms × 1
- webgl × 1
- webrtc × 1
- webshaper × 1
- websharper async × 1
- websharper codemirror × 1
- websharper f# google × 1
- websharper forms × 1
- websharper reactive × 1
- websharper rpc × 1
- websharper sitelets routing × 1
- websharper warp × 1
- websharper-interface-generator × 1
- websharper.chartsjs × 1
- websharper.com × 1
- websharper.exe × 1
- websharper.owin × 1
- websharper.ui.next × 1
- websharper.ui.next jquery × 1
- websockets iis × 1
- why-websharper × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- www.grabbitmedia.com × 1
- xamarin × 1
- xml × 1
- yeoman × 1
- yield × 1
- zafir beta × 1
- zafir websharper4 × 1
- zarovizsga × 1
![]() |
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy |
Built with WebSharper |
Hi All,
I've decided that I am finally going to learn functional programming. I started by trying to implement the ideas from the following paper:
"How to write a financial contract" ([link:research.microsoft.com]
Immediately I ran into an embarrassing problem...I'm not sure how to even start modeling the primitives described in the paper. Should the primitives be a set of independent functions, or should I start with a data-type...and then write a single (long) function to 'value' the contracts?
A very quick summary (for those who haven't read the paper). This paper builds a library for representing financial contracts such as stocks, options, forex, etc. It defines a few 'primitives' such as: zero, one, give, and , or, cond, scale, when, anytime, until, konst, lift, lift2, date, etc. These primitives can be combined to represent various financial instruments mentioned previously. Another part of the paper then gives another set of primitives to allow these contracts to be valued. In other words, once we have defined a stock and an option, we can figure out how much it would cost to purchase them (price of the stock is just looked up n the market, price of the option needs to be calculated). The authors say that this domain specific embedded language is similar to how one might write a compiler for a language (build ast, optimize the tree, generate machine code for different architectures).
Following are the few lines I've written so far: