Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define type member constant in F#?

Tags:

.net

constants

f#

In C# one can define a type member constant like this:

class Foo { public const int Bar = 600; }

The IL looks like this.

.field public static literal int32 Bar = int32(600)

How can I do the same within Visual F# / FSharp?

I tried this to no avail:

[<Sealed>]
 type Foo() =

    [<Literal>]
    let Bar = 600
like image 936
zproxy Avatar asked Mar 08 '10 07:03

zproxy


2 Answers

I did a couple of experiments with the F# compiler and here are some my observations. If you want to create IL literal, then you need to place the value marked as a Literal inside a module. For example like this:

module Constants = 
  [<Literal>]
  let Num = 1

As a side-note, I did a quick search through the F# specification and it seems that literals can be very useful for pattern matching, because you can use them as a pattern (as long as they start with an uppercase letter):

open Constants
match 1 with
| Num -> "1"
| _ -> "other"

Now, the question is, why Literal doesn't behave as you would expect when you place it inside a type declaration. I think the reason is that let declaration inside an F# type declaration cannot be public and will be visible only inside the class/type. I believe that both C# and F# inline literal values when you use them and this is done inside type declarations too. However since the literal cannot be public, there is no reason for generating the literal IL field, because nobody could ever access it.

like image 59
Tomas Petricek Avatar answered Nov 20 '22 04:11

Tomas Petricek


I'm not sure that this is possible. In fact, I don't even think that you can create immutable public fields, not to mention constants.

like image 2
kvb Avatar answered Nov 20 '22 04:11

kvb