Se connecter

Informatique

Linux

Sujet : [Blabla] le /pub des barbus libres
JamyGourmand
Niveau 8
13 août 2014 à 22:27:48

Je comprends pas le pas dans les ranges Haskell :(

En toute logique,

[2,4..10] devrait renvoyer [4,6,8,10] non ? Pourquoi ça renvoie [2,4,6,8,10] en d'autre termes pourquoi il ajoute le pas à la liste?
Et pourquoi si on fait [20,19..1] on a 1..20 en renversé? :hap:

sous-chienne
Niveau 6
13 août 2014 à 22:29:08

Sur une ligne ne veut pas dire plus court.

Théoriquement, tu as plus de charactère au total dans ta ligne de ruby que dans mon expression python de 6 lignes. :hap:

Caletlog
Niveau 10
13 août 2014 à 22:32:18

Richard > parce que j'ai fait bien plus que ça, j'ai aussi demandé explicitement les valeurs que je voulais récupérer dans le tas infini et les ai affichées, tout en illustrant comment les blocks en Ruby développent à la fois le principe des closures et des fonctions de première classe :oui:

Le strict équivalent de ton snippet devrait grosso modo ressembler à ça :
(1..Float::INFINITY).lazy :hap:

JamyGourmand
Niveau 8
13 août 2014 à 22:32:21

Okay j'ai compris.

Il fait la différence entre les deux élements, crée une liste initiale avec les deux premiers élements puis rajoute la différence + le dernier élement jusqu'a ce qu'on arrive à la borne supérieure.

Bordel :hap:

Caletlog
Niveau 10
13 août 2014 à 22:36:12

Jamy > j'ai oublié de préciser, mais en apprenant le Haskell il est plus judicieux d'oublier tout ce que tu sais actuellement sur la programmation et l'algorithmique :oui:
Sauf la récursion. Ça tu vas en manger :rire: :hap:

JamyGourmand
Niveau 8
13 août 2014 à 22:36:34

Oui enfin c'est bien connu le code Ruby est plus court que le code Python, j'aimerais bien comparer le temps d'execution des deux par contre :) :hap:

Pseudo supprimé
Niveau 10
13 août 2014 à 22:38:35

J'ai acheté le bouquin sur le C++ de la noix :oui: ( :hap: ) Je pars un peu en vacance et je m'y remet au retour :)

Caletlog
Niveau 10
13 août 2014 à 22:39:42

Jamy > http://www.wikivs.com/wiki/Python_vs_Ruby#Speed :oui:
Source parfaitement fiable et totalement prouvée, n'insistez pas.
Tu peux te replonger dans ton Haskell :oui: :hap:

vava740
Niveau 10
13 août 2014 à 22:42:38

@Caletlog

x = f(y)

Y'a un moyen avec le .lazy de faire en sorte que f(y) ne soit jamais appelé si x n'est pas utilisé ?

JamyGourmand
Niveau 8
13 août 2014 à 22:44:51

Franchement on s'est tapé les 25 premiers problèmes de project euler avec un pote. Moi avec Ruby (>2.0) et lui Python 3.

Bah résultat en temps d'execution il me niquait à chaque fois :(

Après comme tu as dis il y a peut être la méthode à utiliser en Ruby pour avoir un résultat optimisé, je pense principalement à inject dont je suis très friand et qui est très puissante mais très très lente :pf:

vava740
Niveau 10
13 août 2014 à 22:45:30

Y'a déjà les refinements de Ruby 2.0 qui m'attirent :hap: si y'a aussi une **vraie** évaluation paresseuse ça va me faire venir encore plus vite.

JamyGourmand
Niveau 8
13 août 2014 à 22:46:57

Ruby faut pas s'y mettre si t'as envie de comprendre l'informatique. C'est très efficace mais y a beaucoup trop de wrappers.

Je fais en une ligne en Ruby ce que je fais en 20 lignes en C :hap:

JamyGourmand
Niveau 8
13 août 2014 à 22:54:24

Langages fonctionnels :bave:

Merci Calet sans toi j'aurais attendu quelques mois avant de me lancer dans l'Objective CamL :oui:

Caletlog
Niveau 10
13 août 2014 à 22:55:25

Jamy > C'est le même principe que pour n'importe quel langage de haut niveau.
Et on peut toujours descendre : c'est pas avec du C que tu vas comprendre l'informatique, je fais en une ligne de C ce que je fais en 320 lignes d'assembleur :rire: :hap:
Et niveau wrappers, je trouve que c'est plus l'inverse : les débutants ont tendance à trop utiliser les boucles manuellement, alors qu'on a des collections d'itérateurs super complètes (ce que tu appelles wrappers) pour écrire du Ruby idiomatique.

Franchement, j'aime pas passer pour un gourou d'un langage particulier, mais arrêtez de blâmer le Ruby pour tous les maux en informatique, merde :o))

vava > non, pas que je sache. C'est un simulacre d'évaluation paresseuse, c'est pas vraiment complet (et c'est encore récent ; ruby s'oriente un peu vers le fonctionnel, ça s'améliorera peut-être).
Concrètement .lazy s'applique sur un énumérateur et retourne une sorte d'énumérateur (un objet Enumerator::Lazy) qui redéfinie les méthodes d'inspiration fonctionnelles classiques : map, each_<foo>, ...

JamyGourmand
Niveau 8
13 août 2014 à 22:59:38

Je suis désolé mais c'est la vérité, quand t'as des fonctions built-in qui fout tout le boulot à ta place tu comprends beaucoup moins. J'adore Ruby mais il faut lui attribuer que ce côté est un peu abusé, Python sur ce côté est déjà beaucoup plus viable.

Je t'invite à faire les problèmes du projet euler et de remarquer la certaines complexités de certaines enigmes pourtant résolues en 10 sec avec ce cheat qu'est Ruby.

D'ailleurs je connaissais pas l'évalution paresseuse non plus et c'est en effet assez efficace :oui:

sous-chienne
Niveau 6
13 août 2014 à 23:09:18

"beaucoup plus"
Oklm svp :rire2: :hap:

Oui peut-être, mais juste avoir .lazy() comme ça ne sert pas à grand chose, donc ça veut rien dire.

Tu veux du vrai fonctionnel? Matte ça: http://pastebin.com/2fv9ZKuQ

Les listes de compréhension, vous connaissez ça en natif chez Ruby :question: :hap:

JamyGourmand
Niveau 8
13 août 2014 à 23:10:21

Calet en 100

:hap:

Bordel le routage freebox ne fonctionne pas en IPv6 :ouch:

Si c'est pas inciter les gens à revenir à l'ipv4 ça :honte: :hap:

Caletlog
Niveau 10
13 août 2014 à 23:11:32

Mais on peut pas raisonnablement se plaindre du fait qu'un langage automatise certaines tâches répétitives à partir du moment où cette automatisation n'apporte aucun inconvénient technique ! Pour certaines, c'est même plus performant que leur équivalent à la main (je pense notamment aux :attr_<foo> qui sont en fait directement écrits en C alors que les setters/getters manuels sont interprétés comme du Ruby classique).

Pour l'anecdote, je pense pas non plus que Ruby soit le meilleur langage pour débuter, parce qu'il est tellement souple qu'on finit toujours par trouver la pire méthode pour résoudre un problème si on fait pas attention. Mais pour des développeurs ayant déjà un minimum d'expérience, je vois pas en quoi empaqueter les boucles dans des itérateurs dérivés ou des énumérateurs devrait poser problème :(
Et puis c'est pas comme si les structures originales étaient cachées, on peut toujours les utiliser si on aime réinventer la roue à chaque fois quand une solution éprouvée est déjà disponible.

C'est quand même incroyable de considérer un langage comme 'cheat' parce qu'il vise à simplifier le développement. Qu'on l'attaque sur le point des sacrifices qu'il fait pour ça, okay, mais là, l'histoire des wrappers, ça n'a que des avantages. C'est pas ça en soit qui ralentit l'exécution.

À ce moment-là on la mets où la barrière entre ce qui est okay et ce qui ne l'est pas ? Le C ou le C++ ont bien des fonctions utilitaires qui au final ne sont que des fonctions qui empaquettent d'autres fonctions plus primaires. C'est okay de les utiliser ou c'est du 'cheat' ? :(

D'ailleurs c'est marrant que tu parles du projet euler, parce que j'en ai fait aussi pas mal (une cinquantaine, mais discontinus), en Ruby, Haskell et C++. Et tu seras étonné de voir à quel point le Haskell simplifie la résolution de certains types de problèmes, notamment géométriques. Tu peux littéralement résoudre une bonne partie des 20 premiers problèmes en seulement quelques lignes de Haskell.

Caletlog
Niveau 10
13 août 2014 à 23:12:46

Richard > je suis pas un expert en Python, mais ce snippet c'est pas l'équivalent du premier pastebin que je t'ai montré ? :doute:

Je sais pas vraiment ce qu'est une liste de compréhension donc pour le coup je peux pas te répondre. Tu peux détailler ? Je suis sûr qu'on a ça :oui: :hap:

JamyGourmand
Niveau 8
13 août 2014 à 23:19:06

Ce n'est pas cheat en soi mais ça gène l'apprentissage. Certains chercheurs de mon université trouvent même que le C est de trop haut niveau pour l'enseignement donc :hap:

Il ne s'agit pas de débuter, je pense qu'une fois que tu es sorti d'un cursus de 5 ans d'enseignement en Informatique alors tu peux utiliser Ruby. Dans le cas contraire c'est néfaste et non adapté. Je parle pour des personnes qui souhaitent apprendre l'informatique en tant que science.

La programmation ne se résume pas qu'a apprendre un langage puis traduire les concepts basiques qu'on a dans la tête dans ce langage particulier, une telle manière de faire est équivalente à de la traduction. Il faut assimiler les concepts si tu veux comprendre et être beaucoup plus effiace et percer dans le game.

La première pratique que j'ai cité est aussi connue sous le nom de "pissage de code" :hap:

Je t'invite à voir cette conférence quand tu auras le temps qui est extrêmement enrichissante: http://www.framablog.org/index.php/post/2013/06/11/francois-elie-education-conference

Sujet : [Blabla] le /pub des barbus libres
   Retour haut de page
Consulter la version web de cette page