Plusieurs types pour une fonction Julia
Bonjour
Dans Julia on n'est pas obligé de typer les arguments des fonctions, mais je préfère le faire.
J'ai une fonction
En outre, je définis dans ma fonction Jack une autre fonction, appelée jac:
Dans Julia on n'est pas obligé de typer les arguments des fonctions, mais je préfère le faire.
J'ai une fonction
function Jack(x::Array{Float64,1}, lambda::Array{Int64,1}, alpha::Float64)Je voudrais aussi qu'elle marche avec ces types:
function Jack(x::Array{Rational{Int64},1}, lambda::Array{Int64,1}, alpha::Rational{Int64})Comment faire ça ?
En outre, je définis dans ma fonction Jack une autre fonction, appelée jac:
function Jack(x::Array{Float64,1}, lambda::Array{Int64,1}, alpha::Float64) function jac(m::Int64, k::Int64, mu::Array{Int64,1}, nu::Array{Int64,1}, beta::Float64) ...Je voudrais que lorsqu'on utilise Jack avec du Rational{Int64}, le beta de jac soit un Rational{Int64}. Je ne sais pas si je suis clair là ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
2ème question) pas très claire. Telle que tu l'as écrite, jac ne peux être appelée que par Jack. Pourquoi ne pas mettre le bon type ?
Sinon: la conversion de type, ça marche: tape Rational(1.0); il va te répondre 1//1 .
En revanche Rational(pi) te balancera une erreur.
Voilà mon prog, pour que la 2ème question soit plus claire, et si tu as d'éventuelles remarques.
Ceci dit, quitte à typer, sauf si tu as des raisons très sérieuses de le faire; il est sans doute plus raisonnable de typer avec des types abstraits, mettons Integer plutôt que Int64.
Je suis accro au typage depuis que je me suis mis à Haskell. Mais le système de typage de Haskell me semble mieux élaboré.
Là je suis un peu obligé : je veux utiliser Jack soit avec du Float soit avec du Rational. Dans R, j'ai dû faire une fonction pour chaque type.
Il n'y a pas de typage dans R (mon langage quotidien) et je ne trouve ça pas cool. Imagine f(n) où n doit être un entier. Que se passe-t-il si l'utilisateur entre un non-entier ? Il faut tester, faire un truc du genre:
Pas besoin de faire ça avec le typage.
Et puis c'est plus sympa pour le lecteur du code.
Je viens de tester Jack. Il semble que l'implémentation Julia pulvérise mon implémentation Haskell (en rapidité). Mais je ne suis pas une star en Haskell, peut-être que ma prog n'est pas optimale.
typeof(a) <: Integer
(false pour a=1.0)
ou
isinteger(a)
true pour a=1.0
Finalement, j'ai comparé avec une autre de mes implémentations Haskell, ça semble comparable en rapidité. Dur à dire sans faire des benchmarks.
J'initialise le tableau S à la fin de la fonction Jack: NaN est de type Float64.
Puis le prog, quand je l'utilise avec des Rational, remplit ce tableau avec des Rational. Et il retourne bien un Rational à la fin: Or, quand on met un Rational dans un tableau Float64, le Rational est automatiquement converti en Float64. Je ne comprends donc pas pourquoi Jack retourne quand même un Rational.
Jack([1//3;2//1;1],[0;3;4],5//1)
passe, mais pas
Jack([1//3;2//1;1],[0;3;4],5)
> Jack([1//3;2//1;1],[0;3;4],5//1)
Attention aléa, le deuxième argument doit être une partition d'un entier: un vecteur d'entiers >0 rangés en ordre décroissant. Sinon je ne sais pas ce que sort le code 8-) et faudra pas se plaindre si tout crashe ;-)
Je peux peut-être faire alpha = T(alpha).
https://docs.julialang.org/en/v1/manual/conversion-and-promotion/index.html
Moralement, il me semble que T(x) ne doit être utilisé que quand le programmeur sait parfaitement ce qu'il y a dans x.
Quand j'ai lu T() dans des codes, c'était souvent T(1) ou T(0).