Värden och funktioner i F#
Förord
Värden och funktioner gör man ingen skillnad på i funktionella språk och således inte heller i F#. Se föregående artiklar. "Kom igång med F# i Visual Studio 2010" och "Hantera F# källkodsfiler och varför har inte F# någon Main() metod?"Innehåll
»»
Relaterade artiklar
» Hantera F# källkodsfiler och varför har inte F# någon Main() metod?» Kom igång med F# i Visual Studio 2010.
Värden
I F# ser man ingen skillnad på värden eller funktioner utan dom behandlas likadant.En tilldelning av ett värde ser ut såhär i F#.
Reserverade ordet 'let' betyder att man binder ett värde till ett namn och ska inte jämföras med en variabel som i andra språk utan bara betrakta det som ett värde.
Skickar man denna kod till F# Interactive så ser svaret ut såhär.
Utan att vi har specat någon datatyp så har type inferense angett datatypen för alla värden.
Om du håller muspekaren över ett värde i koden så får du upp en hjälp från type inference om vad exempelvis värdet 'i' får för datatyp.
Värden i F# är som standard 'immutable' vilket betyder att när ett värde eller ett objekt fått sitt värde så kan man inte förändra det.
Mer om 'immutable' och 'muttable' i en senare artikel.
Men man kan exekvera flera rader efter varandra där ett värde får samma namn på flera kodrader.
Det som händer är att namnet x refererar till ett nytt värde efter varje kodrad och i detta exempel så är inte värdet 10 eller 20 längre nåbart uten x referar till värdet 30.
F# Interactive svar när kodraderna exekveras:
F# är också 'case-sensitive'.
Här ett exemple där värden heter samma sak men stavas olika.
Det är alltså 3 olika värden som heter likadant men stavas olika.
Och F# Interactive svarar.
Funktioner
En funktions deklaration kan se ut som detta exempel.eller såhär uppdelat på två rader.
F# Interactive svarar såhär när koden funktionen kompileras:
Svaret ( val add : int -> int -> int ) kan till en början se konstigt ut men betyder att värdet add tar två stycken int parametrar och returerar en int.
Den långa förklaringen är egentligen att man ska läsa det som att det är en funktion som tar en int och returnerar en funktion som tar en int och som i sin tur returnerar en int.
Men du kan gott ta till dig den enkla förklaringen just nu.
Hovrar du över add metoden får du denna hjälp.
Samma add funktion i C# ser ut såhär:
I F# har man skalat bort all onödig syntax, exempelvis som måsvingar i C# och man behöver sällan ange datatypen på värden eller returvärden från funktioner då 'type inference' sköter det.
Men i F# så har mellanslagen och identeringen betydelse.
Allt som är indenterat fyra mellanslag efter funktionsnamnet ser kompilatorn som om det tillhör funktionen.
I F# finns inte return som i C# utan returvärdet är den sista kodraden i funktionen och det som returneras tillbaks.
Skriver vi om add metoden för att ilustrera detta.
Regeln är att allt som tillhör funktionen eller ett uttryck måste vara indenterat fyra mellanslag från dess början.
En felaktig indentering genererar ett fel:
warning FS0058: Possible incorrect indentation: this token is offside of context started at position (15:5). Try indenting this token further or using standard formatting conventions.
Det kan kännas ovat att komma från C# eller VB.NET och inte ha med måsvingar eller 'end' i en funktion men det handlar om vana och själv tycker jag koden på sätt och vis blir tydligare utan.
För att fånga upp värdet från en funktion så ser syntaxen ut såhär.
Anropet till add funktionen görs utan paranteser och komma.
Vill man också anropa en funtion med en annan funktion som parameter så måste paranteserna vara med.
Den andra add funktionen är parameter in till den första add metoden.
För att kompilatorn ska förstå så måste paranteserna vara runt anropet till det andra anropet till add funktionen.
För att ändra datatyp från int till exempelvis float i add funktionen så räcker det med att ändra datatyp på en av parametrarna.
Detta var en intruduktion till värden och funktioner.
Nästa artikel handlar om 'scope' av värden och funktioner, shadowing, lokala värden och funktioner och anonyma funktioner.
Du kan följa mig på twitter som TigerHasse.
0 Kommentarer