Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Jomo Fisher--I'm taking some time now to better understand F#. Right now, I understand the concept of functional code and have some narrow but deep experience by way of the work we did on LINQ for C# 3.0. My goal is to understand F# as well as I understand C#.
First, I downloaded and installed F# from here. Nice that there is source code for the compiler in there. I'll take a closer look at that down the road.
For now, a first program. I put this into a file test.fs:
let rec factorial n = if n <= 1 then 1 else n * factorial (n-1)
That 'rec' next to the 'let' means recursive. So, unlike C# and VB, F# requires an explicit claim of recursiveness. This would let me grep for all recursive functions in a project. Also there's no class definition required. This is actually pretty nice because it gives a very simple starting point. I don't see a reason that C# couldn't work this way as well.
Compile it:
fsc test.fs
And get a warning:
test.fs(1,0): warning: Main module of program is empty: nothing will happen when it is run.
Ok, so this gave me an .exe called test.exe which I expect to have a factorial function in it somewhere. When I put test.exe under Reflector (thanks, as always, Lutz Roeder) and disassemble into C# I see this:
[CompilationMapping(SourceLevelConstruct.Module)]
public class Test
{
// Methods
public static int factorial(int n)
{
if ((n > 1) ^ true)
{
return 1;
}
return (n * factorial(n - 1));
}
}
First, that CompilationMapping attribute is coming from Microsoft.FSharp.Core. I assume this attribute means 'the global methods for this module'. The Test class is in the global namespace. That (n>1)^true is a roundabout way of saying n<=1. Not the most readable thing but I'm not faulting F# for not being disassembleable into pretty C#. Also, I'm not worried about performance. For all I know, the jitter reduces this just fine. If it doesn't, I'm still not worried because performance typically comes from good algorithms, not micro-optimizations.
This posting is provided "AS IS" with no warranties, and confers no rights.
Comments
Anonymous
September 12, 2007
Jomo Fisher--I was curious about type inference in F# and I wondered what would happen if there was reallyAnonymous
September 12, 2007
Jomo Fisher--I was curious about type inference in F# and I wondered what would happen if there was reallyAnonymous
September 12, 2007
Interesting that the "rec" declaration for this method is not captured in the metadata. I might expect to see an attribute representing this to make it inspectable at runtime.Anonymous
September 13, 2007
Acutally, the rec keyword would be a lovely definition to C# lambdas. Making them recursive isn't the prettiest thing in the world.Anonymous
September 17, 2007
Jomo Fisher-- Easily my favorite feature of F# so far is the combination of discriminated union and pattern