Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, 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