Basic Syntax FSharp
April 18, 2018Here is a very quick overview on how to read F# code for newcomers unfamiliar with the syntax.
It is obviously not very detailed but should be enough so that you can read and get the gist of the upcoming examples in this series. Don’t worry if you don’t understand all of it, as I will give more detailed explanations when we get to the actual code examples.
Personally, I think that the F# syntax is very clear and straightforward when you get used to it. In many ways, it is simpler than the C# syntax, with fewer keywords and special cases.
The example code below is a simple F# script that demonstrates most of the concepts that you need on a regular basis.
Type this into a F# script file (with .fsx extension) and send it to the interactive window.
Alternatively, try running this code in the interactive window. Remember to always use ;; at the end to tell the interpreter that you are done entering and ready to evaluate.
// Declare a local value (inferred type is string) let world = "world" // Using '%s' format specifier to include string parameter printfn "Hello %s!" world
// single line comments use a double slash (* multi line comments use (* . . . *) pair -end of multi line comment- *) // ======== "Variables" (but not really) ========== // The "let" keyword defines an (immutable) value let myInt = 5 let myFloat = 3.14 let myString = "hello" //note that no types needed // ======== Lists ============ let twoToFive = [2;3;4;5] // Square brackets create a list with // semicolon delimiters. let oneToFive = 1 :: twoToFive // :: creates list with new 1st element // The result is [1;2;3;4;5] let zeroToFive = [0;1] @ twoToFive // @ concats two lists // IMPORTANT: commas are never used as delimiters, only semicolons! // ======== Functions ======== // The "let" keyword also defines a named function. let square x = x * x // Note that no parens are used. square 3 // Now run the function. Again, no parens. let add x y = x + y // don't use add (x,y)! It means something // completely different. add 2 3 // Now run the function. // to define a multiline function, just use indents. No semicolons needed. let evens list = let isEven x = x%2 = 0 // Define "isEven" as an inner ("nested") function List.filter isEven list // List.filter is a library function // with two parameters: a boolean function // and a list to work on evens oneToFive // Now run the function // You can use parens to clarify precedence. In this example, // do "map" first, with two args, then do "sum" on the result. // Without the parens, "List.map" would be passed as an arg to List.sum let sumOfSquaresTo100 = List.sum ( List.map square [1..100] ) // You can pipe the output of one operation to the next using "|>" // Here is the same sumOfSquares function written using pipes let sumOfSquaresTo100piped = [1..100] |> List.map square |> List.sum // "square" was defined earlier // you can define lambdas (anonymous functions) using the "fun" keyword let sumOfSquaresTo100withFun = [1..100] |> List.map (fun x->x*x) |> List.sum // In F# returns are implicit -- no "return" needed. A function always // returns the value of the last expression used. // ======== Pattern Matching ======== // Match..with.. is a supercharged case/switch statement. let simplePatternMatch = let x = "a" match x with | "a" -> printfn "x is a" | "b" -> printfn "x is b" | _ -> printfn "x is something else" // underscore matches anything // Some(..) and None are roughly analogous to Nullable wrappers let validValue = Some(99) let invalidValue = None // In this example, match..with matches the "Some" and the "None", // and also unpacks the value in the "Some" at the same time. let optionPatternMatch input = match input with | Some i -> printfn "input is an int=%d" i | None -> printfn "input is missing" optionPatternMatch validValue optionPatternMatch invalidValue // ========= Complex Data Types ========= // Tuple types are pairs, triples, etc. Tuples use commas. let twoTuple = 1,2 let threeTuple = "a",2,true // Record types have named fields. Semicolons are separators. type Person = {First:string; Last:string} let person1 = {First="john"; Last="Doe"} // Union types have choices. Vertical bars are separators. type Temp = | DegreesC of float | DegreesF of float let temp = DegreesF 98.6 // Types can be combined recursively in complex ways. // E.g. here is a union type that contains a list of the same type: type Employee = | Worker of Person | Manager of Employee list let jdoe = {First="John";Last="Doe"} let worker = Worker jdoe // ========= Printing ========= // The printf/printfn functions are similar to the // Console.Write/WriteLine functions in C#. printfn "Printing an int %i, a float %f, a bool %b" 1 2.0 true printfn "A string %s, and something generic %A" "hello" [1;2;3;4] // all complex types have pretty printing built in printfn "twoTuple=%A,\nPerson=%A,\nTemp=%A,\nEmployee=%A" twoTuple person1 temp worker // There are also sprintf/sprintfn functions for formatting data // into a string, similar to String.Format.
MKsOrb
[…]we like to honor numerous other net web sites on the net, even though they arent linked to us, by linking to them. Below are some webpages worth checking out[…]
[…] – Nuke – Fake + https://blog.ntechdevelopers.com/f-f-sharp-ban-la-ai/ + https://blog.ntechdevelopers.com/basic-syntax-fsharp/ + https://blog.ntechdevelopers.com/fake-f-make-part-1-install-fake/ [Microservices] – […]