packages feed

alms-0.4.9: examples/ex62-popl-AfArray-type-error.alms

(* Example: demonstrates a type error using affine arrays. *)

#load "ex61-popl-AfArray"

(* This has a type error because a is reused: *)
let deposit (a: int AfArray.array) (ix: int) (amount: int) =
  let (balance, _) = AfArray.get a ix in
    AfArray.set a ix (balance + amount)

(* This is a really bad idea -- and a type error!  Alms reports:
 *
 *  "examples/ex62-popl-AfArray-type-error.alms" (line 6, column 20):
 *  type error: Affine variable a : 'a array duplicated in lambda body
 *
 *  (This example is no longer in the paper.)
 *)
(*
let shuffleAndSort (a: int AfArray.array) =
  let f1 = Future.new (fun _ -> inPlaceShuffle a) in
  let f2 = Future.new (fun _ -> inPlaceSort a) in
    Future.sync f1; Future.sync f2
 *)

(* N.B.: The duplication is the only cause of the type error.
 * This version is well typed:

let shuffleAndSort (a: int AfArray.array) (b: int AfArray.array) =
  let f1 = Future.new (fun _ -> inPlaceShuffle a) in
  let f2 = Future.new (fun _ -> inPlaceSort b) in
    Future.sync f1; Future.sync f2

 *)