#light open System open Microsoft.FSharp.Math printfn "Grundlegende Konstrukte" printfn "---------------------------" let x = 2.2 let (y :float) = (float 3) let z = x + y printfn "%f + %f = %f" x y z printfn "\n\nRekursion" printfn "---------------------------" let rec factorial n = if n=0 then 1 else n * factorial (n-1) printfn "Fakultät von %i: %i" 4 (factorial 4) printfn "\n\nCurrying" printfn "---------------------------" let add x y = x + y let increment x = add x 1 let var = 2 printfn "Ausgangswert: %i" var let var2 = increment var printfn "Inkrementiert: %i" var2 printfn "\n\nPipelining" printfn "---------------------------" let square (x :int) = x * x let negate x = -x let complexFunction x = x |> square |> add 5 |> negate printfn "%i" (complexFunction 10) printfn "\n\nPattern Matching" printfn "---------------------------" let rec factorial2 (n :int64) = match n with | 0L -> 1L | _ -> n * factorial2 (n - (int64 1)) printfn "Fakultät von %i: %i" 20 (factorial2 20L) let rec factorial3 = function | 0 -> 1 | n -> n * factorial3 (n - 1) printfn "Fakultät von %i: %i" 5 (factorial3 5) let rec factorial4 = function | 0 -> 1 | n when n < 0 -> 0 //raise(new Exception("Number cannot be negative!")) | n when n > 0 -> n * factorial4 (n - 1) | _ -> 0 printfn "Fakultät von %i: %i" 5 (factorial3 5) printfn "Fakultät von %i: %i" -5 (factorial4 -5) printfn "\n\nClasses" printfn "---------------------------" type BankAccount = class val owner : string val mutable balance : int new (owner, balance) = { owner = owner balance = balance } member x.Deposit(value) = x.balance <- x.balance + value member x.Withdraw(value) = x.balance <- x.balance - value end let homer = new BankAccount("Homer", 100) let marge = new BankAccount("Marge", 100) let transfer amount (source : BankAccount) (target : BankAccount) = source.Withdraw(amount) target.Deposit(amount) printfn "Transferring %i EUR from %s to %s" amount source.owner target.owner let printAccount (x : BankAccount) = printfn "%s has now %i EUR" x.owner x.balance let printAccounts () = [homer; marge] |> Seq.iter printAccount printAccounts() transfer 50 homer marge printAccounts() transfer 30 marge homer printAccounts() Console.ReadKey()