Xavier Nayrac

Accro au TDD, rubyiste mais pas que, maker, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Un algorithme génétique en Julia - partie 11

| Comments

Niveau : intermédiaire

Hier on a vu qu’il y avait une légère différence de type entre les gènes d’un chromosome avant et après la mutation:

julia> c = Chromosome(create_genes(10))
Chromosome([0,0,0,1,1,1,1,1,0,1])

julia> d = mutate(c)
Chromosome({0,0,0,1,1,1,1,1,0,1})

julia> c.genes
10-element Array{Int32,1}:

julia> d.genes
10-element Array{Any,1}:

C’est l’occasion de regarder un peu les types en Julia.

Voici une fonction foo qui additionne deux nombres:

julia> foo(a, b) = a + b
foo (generic function with 1 method)

julia> foo(1, 2)
3

Que se passe-t-il si je lui passe deux chaînes de caractères ?

julia> foo("he", "llo")
ERROR: no method +(ASCIIString, ASCIIString)

C’est une erreur, puisque la fonction + ne sait pas additionner des chaînes.

Très bien, apprenons à foo l’addition de chaînes. Pour cela, on indique à Julia ce qu’il faut faire lorsque les arguments reçus par foo sont de type String:

julia> foo(a::String, b::String) = "$a$b"
foo (generic function with 2 methods)

julia> foo("he", "llo")
"hello"

Et foo fonctionne toujours avec des nombres:

julia> foo(1, 2)
3

La fonction foo possède 2 méthodes, une à utiliser quand elle reçoit des arguments String, et une autre, à utiliser dans tous les autres cas:

julia> methods(foo)
# 2 methods for generic function "foo":
foo(a::String,b::String) at none:1
foo(a,b) at none:1

La prochaine fois on arrangera notre fonction mutate pour que les gènes conservent le même type.

À demain.

Articles connexes

Commentaires