I think the idea in point one is very interesting but I think being able to output code from FSI is not quite the right solution. I have been using F# with visual studio and the interactive plug in for quite a while now. It great being able to type a line of code then using a keystroke have it executed in the interactive window, plus because the code is already in a text file it by default stored for later use. It is also a hell of a lot easier to go back and change a line if you realise you have made a mistake which is frankly a nightmare when just working with FSI on its own.
However it is not perfect and there are quite a few little features I’d like to change about it, for instance copy and pasting from F# interactive isn’t great, it would be nice to have a key stroke to hop into the F# interactive box, and the F# visual studio integration isn’t that great at managing text files.
It has therefore occurred to me that it might be a good idea to create my own F# IDE, with a real focus on being able to mange text files in “project explorer” style window, having good support for interactively running different parts of your program in the main window and another window for the results of the program.
I don’t think all this would be too hard to archive and it could even be written in F# itself. I think there are some great ideas that could be stolen from John Lam’s RubyCLR IDE [link:port25.technet.com], which I haven’t tried but looks great.
However, there are a couple of things that put me off I think this would be quite time consuming to produce something polished enough to better than the visual studio IDE and also Don Syme has indicated that the visual studio integration will probably be improved to follow some the ideas I suggested.
It [is] great being able to type a line of code then using a keystroke have it executed in the interactive window, plus because the code is already in a text file it by default stored for later use. It is also a hell of a lot easier to go back and change a line if you realise you have made a mistake which is frankly a nightmare when just working with FSI on its own.
[ ... ]
However, there are a couple of things that put me off I think this would be quite time consuming to produce something polished enough to better than the visual studio IDE and also Don Syme has indicated that the visual studio integration will probably be improved to follow some the ideas I suggested.
I am in the awkward position of insisting on using the Visual Studio Express Editions in my work and in anything I produce that I'd like to make available to beginners and enthusiasts. It is great to have IronPython and F# as additions to the armaments for doing that. It is awful, as Robert notes, to use FSI from the console in conjunction with some editor (e.g., notepad) holding the code I am working on. (click save, exit from FSI if I haven't already, launch it with my file again, look at the result, go back to the editor, rinse repeat ...).
I thought the VSCmdShell Power Toy would be helpful, but it requires VS extensibility provisions not found in VS Express Editions as well.
I haven't given up on getting an Express Edition to help here (with some Project/Item template cleverness and maybe even faking a make project). If that avenue fails, I'll use something like jEdit that does have plug-ins that may work (and even provide modest source-code-control integration). This is not exactly beginner-enthusiast level, but it is at least all free (along with the JDK that is needed), and I need to install the JDK for other reasons. Just the same, I would prefer something that works in VS Express Editions because of their quality, ease of installation, and the attraction to newcomers that want to develop on and for Windows.
[ A quick note (I'm on holidays for a week...) ]
Hi Martin,
This is an interesting and thoughtful post (os - a blog for martin?). A couple of quick notes now and more when I return from holidays.
re 2 - F# currently takes the philosophy that module signatures are the mechanism by which values, members and other functionality associated with modules and types are abstracted (hidden). This is also the OCaml philosophy. However the F# design team (primarily James and myself) have agreed in principle to support more direct ways of specifying visibility.
re 3 - ((a.d).e()).f can be written (a.d.e()).f. However you are correct that the application e() does not bind tightly enough (the subsequent "." binds more tightly). We have not yet decided what to do about this but are in the process of doing so - but your solution is one option.
re 4 - ocaml-style variants feel tempting here, or some variation of them (no pun intended).
don
Re 2 Don - I had momentarily forgotten about the use of .fsi files to obscure visibility (I'd previously only used them for documentation and forgotten their more functional use) - this is of course a good option, and it also shows why compiling val fields to internal fields rather than protected ones as I mentioned above is wise.
A blog for me would be quite good, although I'm not sure how often I would update it! Whenever something comes up I guess. Also soon I shall put aforementioned RayTracer up.
Hi Martin,
You wrote:
3. Some left-associative . operator
In C#, I would often find myself writing a.d.e().f accessing a property of the result of a method of a property of object a. To write this in F#, one needs to write ((a.d).e()).f and if there is a long chain of these (as I have sometimes found in C#) this can become cumbersome. It would be useful to have a syntactic sugar left-associative . operator such as :, so that ((a.d).e()).f can be written a:d:e():f. Unforunately this clearly cannot be written as a higher-order function and so needs to be a language feature. Changing the associativity of . could also be a solution, but perhaps a more dramatic one.
Just to let you know that F# 1.1.12.5 is now available and that we have now addressed this issue. From the release notes:
High Precedence Application. A long-standing problem with the F# syntax is that method applications followed by property/field lookups such as obj.Method1(args).Method2(args).Property1.field2
have had to be written with very non-intuitive parentheses, e.g. ((obj.Method1(args)).Method2(args)).Property1.field2
.
To fix this, this release incorporates a minor change in the F# syntax (with and without the #light
syntax option). In particular, applications id(args)
now have higher precedence (i.e. bind more tightly) than the dot-notation. This only applies when no spaces or other whitespace separate the identifier and the arguments.
applications
id(args)
now have higher precedence (i.e. bind more tightly) than the dot-notation. This only applies when no spaces or other whitespace separate the identifier and the arguments.
Great! I was about to comment on approaches to this but I was smart enough to read the rest of the thread first. (By the way, I like the tree-view of the thread that is an available option here.)
For precedent, there is A Programming Language in its early application as a reference language by Ken Iverson and Fred Brooks. The analogy is as follows (where here, evaluation/application is associated right to left):
1
f[ i ] a(x,y) q
are such that the bracketted operands (either [ ... ] or ( ... ) or any other bracketted forms) are bound to the operation on the left, if there is one, so that the above example ends up having the same applicative structure as
1
(f[ i ])((a(x,y))(q))
I haven't asked how they arrived at this, although I think the move from typographical subscripts to A[i,j] forms was influential, along with the implicit right-to-left evaluation where, absent any bracketted operands,
1
f a b c
has the same applicative structure as f(a(b(c))).
I think it is great that something like that principle is workable for "."-chains in F#.
Sounds good. Are these release notes available online anywhere? I can't seem to find them without downloading/installing the package, and was wondering what the other changes were and to whether it was worth downloading this one or waiting until the next more major release.
Also, I have been working on F# coroutines, details of which can be found in another thread in this forum ("Implementation of coroutines in F#")
I've posted the full release notes for F# 1.1.12.5 here.
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 |
F sharp is an up and coming programming language, allowing object-orientated, functional, imperitive approaches as well as a MATLAB-type envrionment and access to the .NET framework. For me, this makes it a very general-purpose language that one can use for pretty much everything. In this article I present a list of changes or additions that I would like to see in F Sharp extending these ideas - it is possible that some of them are implementable in a library to go on top of mllib.dll and fslib.dll, and this is a library I would like to create (say, mclib.dll.) Others are more fundamental and are to do with more the language itself. These I present first, the fourth of which is slightly deeper than the first three:
1. Export code from FSI
I have recently discovered F Sharp Interactive as use as a MATLAB-style envrionment for doing mathematical calculations, and also as, perhaps suprisingly, a form-designer. My F# environment is to use TextPad configured with the F Sharp syntax file (initially from Robert Picking's website, but extended as I've needed to to make more words blue :-) with a link to the F Sharp compiler tool. For form design, I've found FSI to be a good tool - load up FSI, and then line-by-line create a form and add controls to it, edit their properties in real-time as changes are viewed. I currently need to go back after I've done this and export all of the relevant commands, copy and pasting bits - it would be useful if FSI had the ability to export a file containing all of the code that was sucessfully compiled and run in the order it was input to FSI, hence removing this need for the necessary copying-and-pasting. I think this ability would have more general usage too as people can then experiment in FSI and export the code to a file when they've come up with the solution they need.
2. Accessor specification
Currently I believe FSharp compiles members to public members, and vals to internal fields. These are sensible defaults (although I'd maybe go for protected for vals) but it would be very useful to be able to optionally be able to specify the visibility of members and fields to the outside world, e.g. private member p.x, as you can in C#. F# supports the full object model apart from this, and including it would complete F#'s object-orientedness. In particular, if you wish to have private functions within classes used by multiple members, you either need to make them public or create them as local declarations multiple times - the former being a design issue, the latter reproducing code which is very anti-F#. Another possible addition here is support for class attributes such as sealed, private classes, internal classes.
3. Some left-associative . operator
In C#, I would often find myself writing a.d.e().f accessing a property of the result of a method of a property of object a. To write this in F#, one needs to write ((a.d).e()).f and if there is a long chain of these (as I have sometimes found in C#) this can become cumbersome. It would be useful to have a syntactic sugar left-associative . operator such as :, so that ((a.d).e()).f can be written a:d:e():f. Unforunately this clearly cannot be written as a higher-order function and so needs to be a language feature. Changing the associativity of . could also be a solution, but perhaps a more dramatic one.
4. Discriminated Union Compilation Enhancement
The previous two features have been concerned with object-orientated design and coding in F#. This one is too, but goes a little deeper. Clearly there is something very similar about
The former being a lot more concise and nice, of course. However, the first is not extentable, while the latter is, including being extendible in the rest of the .NET world. Now I've noticed that FSharp compiles discriminated unions, quite naturally, to an a class with a.B and a.C classes inheriting from a converting the first above vaguely into the second. It would be nice if when FSC compiles the discriminated union above it would need to split up the code in a.p() into two seperate parts in Ba.p() and Bc.p() as opposed to having all of the implementation in the superclass and a casting switch. My proposition is that it does this, compiling the discriminated union above into the same classes you would get if you were to compile the inheritance-based methods. Alternatively it may be desired that the a discriminated union be compiled to a sealed class, which may be wiser as clients extending discriminated unions could be undesirable. Either way, it would be nice if the compilation split up code of the form similar to p.x() = ... match p with ... into the subclasses (i.e. a._B) rather than using testing for casting into the subclasses in the superclass, as is currently being done, and it is this enhancement that I am proposing. Using a casting switch isn't a particularly elegant way of doing it, and causes (very, very, very) slight twinges of guilt whenever I use the discriminated union construct above knowing it will be compiled to this.
And now on to features that could in principle be implemented in a library to go on top of mllib and fslib, or indeed additions to the core libraries themselves. I would like to look at implementing some of these after I finish work towards the end of the summer:
5. Ocaml Standard Modules
The implementation of the standard ocaml library in mllib are currently incomplete. Implementing more of these would increase compatability with ocaml programs. Some of these would be relatively trivial to implement, e.g. Random, and some not so much, e.g. creating an implementation of the Graphics module using GDI+. In addition a few extra functions could be added to the current ones, e.g. for the List module take, drop, takewhile, dropwhile, fold_left2, map_index etc.
6. Full meta notation support
F Sharp currently allows meta programming through Quotations. I would like this MSP style to be fully supported, allowing the three constructs of MetaML - Brackets, Run and Escape and find direct equivalents of all three in F# to allow me to write a staged interpreter. Quotations allow the brackets <@ @> and we can use templates <@ 1 + _ @> for the escape idea, but there seems to be no obvious way of compiling and invoking quotations - that is a function run : 'a expr -> 'a. We need this for full MetaML support, and it seems to not quite yet exist in F# (it is mentioned briefly in Don's Leveraging .NET Meta-programming Components from F# paper.)
7. Coroutine notation support>
Another paradigm that exists is that of co-routines, i.e. the Cocall, Resume and Yield constructs. Coroutines are a generalisation of generators and a specialisation of concurrent processes. It would be nice to have full support for these in F#, probably with a Coroutine data type that is implemented via threading. We would have
val cocall : (('b -> unit) -> 'b) -> 'b coroutine
val resume : 'b coroutine -> 'b
Note that this 'b coroutine object can be implemented via threading. (Note the above could (and should?) be generalised slightly to having yield return a value to the coroutine specified as an extra parameter of resume, giving a more symetric view of two processes.)
To create a co-routine that counts from a to b and then returns zero we can use
I would also recommend that this coroutine type implements IEnumerable and such types, giving us full support for the yield concept of C# 2.0.
8. Extension of Maths library
FSI can currently be used, as I mentioned above, as a matlab-style maths libary. However it's currently only the basis of such, and some immediate but basic extra functions could be matrix inverses, determinants, polynomial and simultaneous equation sorting and numerical calculus (differentiate : (float -> float) -> float -> float.) Implementation of some of these ideas I feel would be also be a useful extension to F#.
9. Generic XML Parser
I recently found myself with complicated object or discriminated union hierarchies, and wanting to input one of these hirarchies into my program to run said program on it. A natural way to do this is by parsing an XML document, which is itself hierarchical, however it is tiresome to write an XML parser for each of these type of structures. Hence I thought it would be useful to have something that will automatically fill in the structure from the XML file using reflection. For example, from
the equivalent of running the string new A(new B(1,3), new E(2, new G())) is created and passed to the program. Constructor n-ary overloading is very useful here (see my RayTracer project.) Furthermore, because of the way discriminated unions are compiled, we can use this directly as follows:
then an A can be instantiated by interpreting
in the above way, which does so via the constructor new A._D(new A._B, new A._C("gogoo")). (Again this constructor is compiled and run at runtime using reflection.)
I have created an initial quick and dirty version of this, which works, in my RayTracer project, details of which shall or have already appeared elsewhere. To add additional functionality, since we sometimes have lists, I allow the user to pass in a dictionary which specifies whether the inner XML of an element is passed as multiple parameters, or a single parameter as a list e.g.
Here the third parameter is a function taking the name of the type, the number of parameters found before the inner XML is entered (i.e. attributes specified, for use in n-ary overloaded constructors - again see RayTracer) followed by None if the inner XML is to be parsed as continuing the list of parameters, or Some "T" if the inner XML is to be parsed as an instance of List<T>.
If this sounds confusing and/or too specific, check out my RayTracer project which uses this technology heavily. It should be obvious what is going on by looking at Documentation.txt (user documentation for the XML file) and the source code (class structure) and, if you need it, the examples. I think this is a useful tool in many situations and perhaps worth including in the general library.
10. Knowledge base support
A small backwards-chaining prolog-style knowledge base in F# could be useful. This is perhaps to specific for the F# library itself, but could be a sample and is just generally useful - it would be suitable for my mclib, and would contribute to the goal of making F# the general all around language for everything in a .NET environment allowing one to use it for logic programming too. We would have