
contract Identity =

  function zip_with(f, xs, ys) =
    switch((xs, ys))
      (x :: xs, y :: ys) => f(x, y) :: zip_with(f, xs, ys)
      _ => []

  // Check that we can use zip_with at different types

  function foo() =
    zip_with((x, y) => x + y, [1, 2, 3], [4, 5, 6, 7])

  function bar() =
    zip_with((x, y) => if(x) y else 0, [true, false, true, false], [1, 2, 3])

