Overloading by number of arguments is supported without issue.
Arbitrary member overloading by type is supported through an thinly documented feature called "OverloadID". F# simply asks that a unique name be given for each overload that is ambiguous by name and number of arugments - strictly speacking this should not be necessary once a full type signature has been given, but it is necessary in the case of inferred signatures.
At some point we will simply require that these sorts of overloads are given full type signatures, when the OverloadID will then become redundant and ignored, and possibly deprecated in some v2.0 of the language.
Anyway, to use this, simply add the OverloadID attribute to each member, giving a different qualifying name in each case. These names must be identical if you also give a signature.
type ITest = interface
[<OverloadID("Item.get.Int")>]
abstract Item : int -> float with get
[<OverloadID("Item.get.string")>]
abstract Item : string -> float with get
end
And from prim-types.fsi:
Arbitrary member overloading by type is supported through an thinly documented feature called "OverloadID". F# simply asks that a unique name be given for each overload that is ambiguous by name and number of arugments - strictly speacking this should not be necessary once a full type signature has been given, but it is necessary in the case of inferred signatures.
At some point we will simply require that these sorts of overloads are given full type signatures, when the OverloadID will then become redundant and ignored, and possibly deprecated in some v2.0 of the language.
Anyway, to use this, simply add the OverloadID attribute to each member, giving a different qualifying name in each case. These names must be identical if you also give a signature.
type ITest = interface
[<OverloadID("Item.get.Int")>]
abstract Item : int -> float with get
[<OverloadID("Item.get.string")>]
abstract Item : string -> float with get
end
And from prim-types.fsi:
/// Adding the OverloadID attribute to a member permits it to
/// be part of a group overloaded by the same name and arity. The string
/// must be a unique name amongst those in the overload set. Overrides
/// of this method, if permitted, must be given the same OverloadID,
/// and the OverloadID must be specified in both signature and implementation
/// files if signature files are used.
type OverloadIDAttribute =
class
inherit System.Attribute
val v: string
new : string -> OverloadIDAttribute
end
Hi Don,
I am doing something wrong because I cannot get it to work. I pasted your example into VS2005 and it complained about a syntax error. Here is another simple example:
open System
open Microsoft.FSharp
type Test = class
val name : string
// Constructors
[OverloadID("Test.new.string")]
new(nm:string) = {name = nm; }
[OverloadID("Test.new.Int")]
new(idx:int) = { name = Int32.to_string(idx); }
end
I keep getting a syntax error. It's got to be something simple.
Thanks for patiently answering all my questions.
Regards
Chris
I am doing something wrong because I cannot get it to work. I pasted your example into VS2005 and it complained about a syntax error. Here is another simple example:
open System
open Microsoft.FSharp
type Test = class
val name : string
// Constructors
[OverloadID("Test.new.string")]
new(nm:string) = {name = nm; }
[OverloadID("Test.new.Int")]
new(idx:int) = { name = Int32.to_string(idx); }
end
I keep getting a syntax error. It's got to be something simple.
Thanks for patiently answering all my questions.
Regards
Chris
Chris,
The syntax error is in the attribute declaration. It should read:
All attributes in F# are wrapped in [< >] unlike the C# style of [ ] (and appears to be a simple typo in Don's code above).
Let me know if that doesn't work as it executes cleanly like so:
creating objects ab and ac with names = "hi" and "400" (as strings) respectively.
---O
The syntax error is in the attribute declaration. It should read:
open System
open Microsoft.FSharp
type Test = class
val name : string
// Constructors
[<OverloadID("Test.new.string")>]
new(nm:string) = {name = nm; }
[<OverloadID("Test.new.Int")>]
new(idx:int) = { name = Int32.to_string(idx); }
end
All attributes in F# are wrapped in [< >] unlike the C# style of [ ] (and appears to be a simple typo in Don's code above).
Let me know if that doesn't work as it executes cleanly like so:
let ab = new Test("hi");;
let ac = new Test(400);;
creating objects ab and ac with names = "hi" and "400" (as strings) respectively.
---O
Apologies! Normally I make a point of type-checking and running code before I post it!
I'll edit the post above, just to avoid confusing later readers.
I'll edit the post above, just to avoid confusing later readers.
Topic tags
- f# × 3663
- compiler × 263
- functional × 199
- websharper × 120
- c# × 119
- 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
- type provider × 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
- kendo × 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
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- addin × 1
- agents × 1
- agile × 1
- alter session × 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
- current_schema × 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
- examples × 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
- kendochart × 1
- kendoui × 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
- sqlentityconnection × 1
- stickynotes × 1
- stress × 1
- strong name × 1
- structures × 1
- tdd × 1
- template × 1
- tracing × 1
- tsunamiide × 1
- type inference × 1
- type providers × 1
- typescript × 1
- upload × 1
- vb × 1
- vb.net × 1
- vector × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio shell × 1
- visualstudio × 1
- web api × 1
- webapi × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- xml × 1
- zarovizsga × 1
|
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us |
Built with WebSharper |
type ITest = interface
abstract Item : int -> float with get
abstract Item : string -> float with get
end
Error: Duplicate definition of value in 'ITest.Item.get.2'.
Is there a different way to do this in F#?
Thanks in advance.
Regards
Chris