On Github Szczyp / functional-programming
Created by szczyp and bpr
Oh hey, these are some notes. They'll be hidden in your presentation, but you can see them if you open the speaker notes window (hit 's' on your keyboard).
Tell the machine how to do a thing
          var list = new List<int>();
for(int i = 0; i < 10; i++)
{
  if(i % 2 == 0)
    list.Add(i);
}
        
      Tell the machine what to do
        var list = Enumerable.Range(0, 9).Where(i => i % 2 == 0).ToList();
            
      abstract class BankAccount
{
  protected decimal balance;
  public abstract decimal CurrentBalance { get; }
  public BankAccount (decimal balance)
  {
     this.balance = balance; 
  }
}
          class Current : BankAccount
{
  public decimal CurrentBalance { get { return balance; } }
  public Current (decimal balance)
    : base(balance)
	{
	}
}
          class TimeDeposit : BankAccount
{
  float rate;
  DateTime term;
  public TimeDeposit(decimal balance, float rate, DateTime term)
    : base(balance)
  {
    this.rate = rate;
    this.term = term;
  }
  public decimal CurrentBalance 
  { 
    get 
    {
      if (DateTime.Now > term)
        return balance + balance * rate;
      else
        return balance;
    } 
  }
}
          type BankAccount =
       Current of decimal
     | TimeDeposit of balance:decimal * rate:float * term:DateTime
          type Email = string
type Coords = float * float
type ContactInfo = { Name : string; Location : Coords; Email : Email }
            type Contact = Active of ContactInfo | Inactive of ContactInfo * DateTime
let currentBalance = function
    Current b -> b
  | TimeDeposit(b,r,t) -> if DateTime.Now > t then b + b * r else b
        let currentBalance acc = match acc with
    Current b -> b
  | TimeDeposit(b,r,t) -> if DateTime.Now > t then b + b * r else b
        class CallDeposit : BankAccount
{
  float rate;
  public CallDeposit(decimal balance, float rate)
    : base(balance)
  {
    this.rate = rate;
  }
  public decimal CurrentBalance 
  {
    get { return balance + balance * rate; } 
  }
}
        type BankAccount =
       Current of decimal
     | TimeDeposit of balance:decimal * rate:float * term:DateTime
     | CallDeposit of balance:decimal * rate:float
      let currentBalance = function
    Current b -> b
  | TimeDeposit(b,r,t) -> if DateTime.Now > t then b + b * r else b
  | CallDeposit (b, r) -> b + b * r
        // BankAccount
public abstract void Withdraw(decimal amount);
// Current
public void Withdraw(decimal amount)
{
  balance -= amount;
}
// TimeDeposit
public void Withdraw(decimal amount)
{
  if (DateTime.Now > term)
    balance -= amount;
}
// CallDeposit
public void Withdraw(decimal amount)
{
  if(amount <= balance)
    balance -= amount;
}
      let withdraw a = function
    Current b -> Current(b-a)
  | TimeDeposit(b,r,t) as td -> if DateTime.Now > t then TimeDeposit(b-a,r,t) else td
  | CallDeposit(b,r) as cd -> if a <= b then CallDeposit(b-a,r) else cd