Note
This is a small article about two very convenient function in the OCaml language.
Avis
If the name OCaml does not ring a bell for you, this article will probably not interest you at all!
These are two very classical functions, from the modules List [2] and Array [1].
These functions are iterators of the following type:
val List.iter : ('a -> unit) -> 'a list -> unit val Array.iter : ('a -> unit) -> 'a array -> unit
They allow to apply a certain function f : 'a -> unit which acts by side effects (e.g., printing) to each element of a list or an array.
Very convenient!
But... quite often, we need more than just the value of x of each element, we might need their index i (for instance to print something like "the ith value contains x[i]").
So, we would like to have two other iterator functions with the following signature:
val List.iteri : (int -> 'a -> unit) -> 'a list -> unit val Array.iteri : (int -> 'a -> unit) -> 'a array -> unit
Now, f accepts as first argument the index i corresponding to its second argument the value xi. That will be very convenient to avoid for loops!
Note
In Python... ?
The common syntax for every iterator is already doing this, e.g. :
for i in [2*i for i in range(8)]: print i
And the enumerate function also allows to iterate on both index and value, i, xi.
We can check that Array.iteri has been implemented back in 1997 [3], but its straightforward equivalent for lists List.iteri has only been added in... 2010 with OCaml v4.00.1 ! (cf [4]).
These two functions are very useful, and so they are used a lot.
During some programming projects and exercises that were asked to me during some courses at ENS Cachan, I have been ask to make my OCaml code work on at least a machine in room 411, machines which were old at this time!
And that's why in December 2013, we lost a few minutes (during an oral exam) trying to find the source of a bug, and I included a tiny "patch" v3.12 → v4.01.0 which adds manually the code for List.iteri in my project [5].
In particular, this link [6] shows the different modifications on my code, after I saw this bug.
That's basically what this (useless) article was about.
References
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|