85 votes

Quelle langue apprendre après Haskell?

Comme mon premier langage de programmation, j'ai décidé d'apprendre Haskell. Je suis une philosophie analytique majeur, et Haskell m'a permis de rapidement et correctement, créer des programmes d'intérêt, par exemple, de capteurs pour le langage naturel de l'analyse, des démonstrateurs et des interprètes. Bien que je ne l'ai été de programmation pour deux mois et demi, j'ai trouvé Haskell de la sémantique et de la syntaxe beaucoup plus facile à apprendre que le plus traditionnel des langages impératifs, et se sentent à l'aise (maintenant) avec la majorité de ses constructions.

La programmation Haskell est comme la sorcellerie, cependant, et j'aimerais élargir mes connaissances de la programmation. Je voudrais choisir un nouveau langage à apprendre, mais je n'ai pas assez de temps pour ramasser un arbitraire de la langue, de la déposer, et répétez. J'ai donc pensé que je voudrais poser la question ici, ainsi que plusieurs dispositions sur le type de langue, je suis à la recherche d'. Certains sont subjectifs, certains sont destinés à faciliter la transition de Haskell.

  • Forte type de système. Une de mes parties préférées de la programmation Haskell est écrit à ce type de déclarations. Cela permet de structurer mes pensées sur les différentes fonctions et leur relation à l'ensemble du programme. Il fait également de manière informelle raisonnement au sujet de l'exactitude de mon programme plus facile. Je suis préoccupé par la justesse, pas l'efficacité.
  • L'accent sur la récursivité plutôt que d'itération. J'utilise itératif constructions en Haskell, mais de les mettre en œuvre de manière récursive. Cependant, il est beaucoup plus facile de comprendre la structure d'une fonction récursive qu'une complexe procédure itérative, en particulier lors de l'utilisation de combinators et fonctions d'ordre supérieur, comme les cartes, les plis et les lier.
  • Enrichissant d'apprendre. Haskell est un enrichissant la langue de travail. C'est un peu comme la lecture de Kant. Mon expérience de plusieurs années avec C, cependant, ne l'était pas. Je ne suis pas à la recherche de C. de La langue doit appliquer une conceptuellement intéressant de paradigme, qui, à mon entièrement l'avis subjectif, le C-aime pas.

De pesée les réponses: ce sont des notes de cours. Je voudrais juste répondre à tout le monde qui a donné bien formé réponses. Vous avez été très utile.

1) Plusieurs réponses indiquent qu'une forte, typé statiquement langue en insistant sur la récursivité signifie un autre langage fonctionnel. Alors que je veux continuer à travailler fortement avec Haskell, camccann et larsmans souligné à juste titre qu'une autre langue serait "faciliter la transition de trop." Ces commentaires ont été très utiles, car je ne suis pas à la recherche d'écrire en Caml, Haskell! De la preuve des assistants, le Coq et Agda à la fois l'air intéressant. En particulier, le Coq serait de fournir une solide introduction à une logique formelle et de la théorie des types. J'ai passé un peu de temps avec le premier ordre de prédicat et de la logique modale (Mendellsohn, Enderton, certains de Service), alors je serais probablement avoir beaucoup de plaisir avec Coq.

2) d'Autres privilégiée Lisp (Common Lisp, Scheme et Clojure). De ce que je comprends, tant en Common Lisp et Scheme ont une excellente introduction (Sur le langage Lisp et Motivé Intrigant, SICP). Le matériau en SICP me fait pencher vers le Schéma. En particulier, le Régime par le biais de SICP couvrirait une autre stratégie d'évaluation, la mise en œuvre de la paresse, et une chance de se concentrer sur des sujets comme les continuations, les interprètes, le calcul symbolique, et ainsi de suite. Enfin, comme d'autres l'ont souligné, Lisp de traitement de code/données entièrement nouvelles. Donc, je me penche fortement vers l'option (2), un Lisp.

3) La Troisième, Prolog. Prologue a une richesse de matériel intéressant, et son principal domaine est exactement celui que je suis intéressé. Il a une syntaxe simple et facile à lire. Je ne peux pas commenter plus pour le moment, mais après la lecture d'un survol de Prolog et l'écrémage quelques éléments introductifs, il les rangs (2). Et il semble comme le Prologue de la mandature est toujours être piraté en Haskell!

4) les principaux langages, Python semble le plus intéressant. Tim Yates rend les langues sembler très attrayant. Apparemment, le Python est souvent enseigné en première année de CS majors; donc c'est soit sur le plan conceptuel riche ou la plus facile à apprendre. Je devrais faire plus de recherche.

Merci à tous pour vos recommandations! Il ressemble à un Lisp (Régime, Clojure), Prolog, ou un assistant de preuve comme Coq ou Agda sont les principales langues recommandé.

85voto

C. A. McCann Points 56834

Je voudrais élargir mes connaissances de la programmation. (...) J'ai pensé que je voudrais poser la question ici, ainsi que plusieurs dispositions sur le type de langue, je suis à la recherche d'. Certains sont subjectifs, certains sont destinés à faciliter la transition de Haskell.

Forte type de système. (...) Il fait aussi de manière informelle raisonnement au sujet de l'exactitude de mon programme plus facile. Je suis préoccupé par la justesse, pas l'efficacité.

L'accent sur la récursivité plutôt que d'itération. (...)

Vous avez peut-être faciliter la transition un peu trop ici, je le crains. Le très strict système de type et de style purement fonctionnel sont caractéristiques de Haskell et à peu près tout ce qui ressemble à une programmation grand public langue, il faudra compromettre au moins un peu sur l'un de ces. Donc, avec cela à l'esprit, voici quelques-unes des suggestions visant à maintenir la plupart de ce que vous semblez comme sur Haskell, mais avec quelques changement majeur.

  • Le mépris de praticité et d'aller "plus de Haskell que Haskell": Haskell type de système est plein de trous, en raison de nontermination et d'autres désordonné des compromis. Nettoyer le gâchis et d'ajouter des fonctionnalités les plus puissantes et vous obtenez les langues, comme le Coq et Agda, où une fonction du type contient une preuve de sa justesse (vous pouvez même lire à la fonction flèche -> comme implication logique!). Ces langues ont été utilisées pour les preuves mathématiques et pour les programmes avec une très grande exactitude les exigences. Coq est probablement le plus éminent de la langue de ce style, mais Agda a plus Haskell-y sentir (ainsi que d'être écrit en Haskell lui-même).

  • Mépris types, ajouter plus de magie: Si Haskell est de la sorcellerie, Lisp est la première, originelle de la magie de la création. Lisp-famille de langues (y compris Régime et Clojure) ont presque d'une souplesse sans précédent avec l'extrême minimalisme. Les langues ont pratiquement pas de la syntaxe, de l'écriture de code directement dans la forme d'un arbre de structure de données; la métaprogrammation en Lisp est plus facile que les non-méta-programmation dans certaines langues.

  • Compromis un peu et de se rapprocher de l'ordinaire: Haskell tombe dans la vaste famille des langues très fortement influencé par ML, tout de qui vous pourriez probablement passer sans trop trop de difficulté. Haskell est l'une des plus strictes quand il s'agit de l'exactitude des garanties de types et l'utilisation de la fonctionnelle de style, là où les autres sont souvent des hybrides styles et/ou de faire des compromis pragmatique pour diverses raisons. Si vous voulez un peu d'exposition à la programmation orientée objet et de l'accès à beaucoup de la technologie grand public des plates-formes, soit Scala sur la JVM ou F# sur .NET ont beaucoup en commun avec Haskell tout en facilitant l'interopérabilité avec Java et .NET plates-formes. F# est pris en charge directement par Microsoft, mais a quelques ennuyeux limites par rapport à Haskell et des problèmes de portabilité sur d'autres plates-formes. Scala a direct homologues à plus de Haskell type de système et Java cross plate-forme de potentiel, mais a une plus luxueux de la syntaxe et n'a pas les puissants de la première partie du soutien que F# jouit.

La plupart de ces recommandations sont également mentionnés dans d'autres réponses, mais j'espère que mon raisonnement pour eux offre une certaine illumination.

20voto

Chuck Points 138930

Je vais être ce Gars-là et suggèrent que vous demandez quelque chose de mal.

Tout d'abord vous dire que vous voulez élargir vos horizons. Puis vous décrire le type de langue que vous voulez, et de ses horizons sonores incroyablement comme les horizons que vous avez déjà. Vous n'allez pas gagner beaucoup par apprendre la même chose encore et encore.

Je vous suggère d'apprendre Lisp - c'est à dire Common Lisp, Scheme/Raquette ou Clojure. Ils sont tous typées dynamiquement par défaut, mais une sorte de type hinting ou facultatif de typage statique. Raquette et Clojure sont probablement votre meilleur pari.

Clojure est plus récente et a plus Haskellisms comme l'immuabilité par défaut et beaucoup de paresseux évaluation, mais il est basé sur une Machine Virtuelle Java, ce qui signifie qu'il a de drôles de verrues (par exemple, la JVM ne supporte pas la queue d'appel d'élimination, de sorte que la récursivité est une sorte de hack).

La raquette est beaucoup plus ancienne, mais a ramassé beaucoup de puissance le long de la voie, comme statique type de support et de mettre l'accent sur la programmation fonctionnelle. Je pense que vous auriez probablement obtenir les la plupart hors de la Raquette.

La macro systèmes Lisps sont très intéressants et beaucoup plus puissante que tout ce que vous allez voir n'importe où ailleurs. Qui vaut à elle seule au moins regardant.

19voto

sclv Points 25335

Du point de vue de ce qui convient à votre majeure, le choix évident semble être un langage logique tel que Prolog ou ses dérivés. La programmation logique peut être très bien réalisée dans un langage fonctionnel (voir, par exemple, The Reasoned Schemer ), mais vous pouvez aimer travailler directement avec le paradigme logique.

Un système de démonstration de théorèmes interactif tel que twelf ou coq pourrait également vous plaire.

18voto

Thomas M. DuBuisson Points 31851

Je vous conseille d'apprendre le Coq, qui est un puissant assistant de preuve avec la syntaxe qui se sentent à l'aise pour le Haskell programmeur. La chose cool à propos de Coq est-il peut être extrait à d'autres langages fonctionnels, y compris Haskell. Il y a même un paquet (Meldable-Tas) sur Hackage qui a été écrit en Coq, avait des propriétés éprouvées sur son fonctionnement, puis extrait à Haskell.

Une autre langue populaire qui offre plus de puissance que Haskell est Agda - je ne sais pas Agda-delà de la connaissance, il est dépendante tapé, sur le Hackage, et respecté par les gens que je respecte, mais ceux qui sont assez bonnes raisons pour moi.

Je ne m'attends pas à un de ces être facile. Mais si vous savez Haskell et vouloir aller de l'avant dans une langue qui donne plus de puissance que le Haskell type de système alors qu'elles devraient être considérées.

11voto

danlei Points 8602

Comme vous n'avez pas mentionné toutes les restrictions en plus de vos intérêts subjectifs et de souligner 'enrichissant d'apprendre" (bon, ok, je vais ignorer le typage statique restriction), je suggère d'apprendre quelques langues de différents paradigmes, et de préférence ceux qui sont "exemplaire" pour chacun d'eux.

  • Un Lisp dialecte pour le code en tant que données/homoiconicity chose et parce qu'ils sont bons, si ce n'est le meilleur, des exemples de dynamique (plus ou moins stricte) langages de programmation fonctionnelle
  • Prolog comme le principal langage de programmation logique
  • Smalltalk comme le seul vrai langage de programmation orientée objet (également intéressant en raison de son habitude extrêmement image de l'approche centrée sur l')
  • peut-être Erlang ou Clojure si vous êtes intéressé par les langues forgé parallèles/parallel/programmation distribuée
  • En avant pour la pile de la programmation orientée
  • (Haskell pour le strict fonctionnel typé statiquement la programmation différée)

Surtout Lisps (CL-être pas autant que le Schéma) et Prolog (et Haskell) embrasser la récursivité.

Bien que je ne suis pas un gourou dans une de ces langues, j'ai fait passer un peu de temps avec chacun d'eux, à l'exception Erlang-et-Vient, et ils ont tous donné m'a ouvert les yeux et intéressantes expériences d'apprentissage, comme chacune des approches de résolution de problèmes à partir d'un angle différent.

Donc, s'il peut sembler comme si je l'ai ignoré la partie de votre avoir de temps pour essayer un peu de langues, je pense plutôt que le temps passé avec un de ces ne sera pas gaspillé, et vous devriez avoir un regard sur l'ensemble d'entre eux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X