Itérateurs

map / fold / mapfold

Ainsi que mapi, foldi et mapfoldi

dessin

fun add1(a : int) returns (b : int)
let
  b = a + 1;
tel

const n : int = 4

node main (x : int^n) returns (y : int^n)
let
  (* On peut enchainée les maps *)
  y = map<<n>> add1(map<<n>> add1(x));
tel

Type

map

types

fun add1(a : int) returns (b : int)
let
  b = a + 1;
tel

const n : int = 4

node main (x : int^n) returns (y : int^n)
let
  (* On peut enchainée les maps *)
  y = map<<n>> add1(map<<n>> add1(x));
tel

\begin{aligned} (y^{1},y^{2}) = \text{map<<}n\text{>> } F(x^{1},x^{2},x^{3}) \\\\ \forall 1 \leq i \leq n, (y^{1}[i], y^{2}[i]) = F(x^{1}[i], F(x^{2}[i], F(x^{3}[i]) \end{aligned}

fold

fold
y = fold<<n>> F(x, a);
Par exemple : y = F(x[2], F(x[1], F(x[0], a)))

fun add(a, b : int) returns (c : int)
let
  c = a + b;
tel

fun sum<<n : int>>(x : int^n) returns (s : int)
let
  s = fold<<n>> add(x, 0);
tel

node main() returns (s : int)
let
  s = sum<<3>>([1, 2, 3]); (* renvois 6 *)
tel

types_fold

mapfold

mapfold
(z, y) = mapfold<<n>> F(x, v);

fun f(a, acc : int) returns (b, newacc : int)
let
  b = a + acc;
  newacc = b; (* cas simple *)
tel

node csum_array<<n : int>>(x : int^n) returns (z : int^n)
var y : int;
let
  (z, y) = mapfold<<n>> f(x, 0 fby y);
tel

node main() returns (s : int^3)
let
  s = csum_array<<3>>([1, 2, 3]);
tel

mapfold-circuit

types_mapfold

fun add2(a, b : int) returns (c : int)
let
  c = a + b;
tel

fun test(x : int^3) returns (o : int^3)
var y : int^3;
let
  y = [ x with [1] = 42 ];
  o = map<<3>> add2(x, y);
tel

Exercices

1. Le son

son