Quale lingua imparare dopo Haskell? [chiuso]


85

Come mio primo linguaggio di programmazione, ho deciso di imparare Haskell. Sono una specializzazione in filosofia analitica e Haskell mi ha permesso di creare rapidamente e correttamente programmi di interesse, ad esempio trasduttori per l'analisi del linguaggio naturale, dimostratori di teoremi e interpreti. Sebbene programmassi solo da due mesi e mezzo, ho trovato la semantica e la sintassi di Haskell molto più facili da imparare rispetto ai linguaggi imperativi più tradizionali e mi sento a mio agio (ora) con la maggior parte dei suoi costrutti.

La programmazione in Haskell è come la stregoneria, tuttavia, e vorrei ampliare la mia conoscenza della programmazione. Vorrei scegliere un nuovo linguaggio di programmazione da imparare, ma non ho abbastanza tempo per prendere un linguaggio arbitrario, lasciarlo cadere e ripetere. Quindi ho pensato di porre la domanda qui, insieme a diverse disposizioni sul tipo di lingua che sto cercando. Alcuni sono soggettivi, altri hanno lo scopo di facilitare la transizione da Haskell.

  • Sistema di tipo forte. Una delle mie parti preferite della programmazione in Haskell è scrivere dichiarazioni di tipo. Questo aiuta a strutturare i miei pensieri sulle singole funzioni e sulla loro relazione con il programma nel suo complesso. Rende anche più facile ragionare in modo informale sulla correttezza del mio programma. Mi interessa la correttezza, non l'efficienza.
  • Enfasi sulla ricorsione piuttosto che sull'iterazione. Uso costrutti iterativi in ​​Haskell, ma li implemento in modo ricorsivo. Tuttavia, è molto più facile capire la struttura di una funzione ricorsiva rispetto a una complicata procedura iterativa, specialmente quando si usano combinatori e funzioni di ordine superiore come mappe, pieghe e legami.
  • Appagante imparare. Haskell è un linguaggio gratificante in cui lavorare. È un po 'come leggere Kant. La mia esperienza di diversi anni fa con C, tuttavia, non lo era. Non sto cercando C. Il linguaggio dovrebbe imporre un paradigma concettualmente interessante, che a mio parere del tutto soggettivo, i C-like non lo fanno.

Valutare le risposte : queste sono solo note, ovviamente. Vorrei solo rispondere a tutti coloro che hanno dato risposte ben formate. Sei stato molto utile.

1) Diverse risposte hanno indicato che un linguaggio forte e staticamente tipizzato che enfatizza la ricorsione significa un altro linguaggio funzionale. Anche se voglio continuare a lavorare intensamente con Haskell, camccann e larsmans hanno correttamente sottolineato che un altro linguaggio simile "faciliterebbe troppo la transizione". Questi commenti sono stati molto utili, perché non sto cercando di scrivere Haskell in Caml! Degli assistenti alla prova, Coq e Agda sembrano entrambi interessanti. In particolare, Coq fornirebbe una solida introduzione alla logica costruttiva e alla teoria dei tipi formali. Ho passato un po 'di tempo con il predicato del primo ordine e la logica modale (Mendellsohn, Enderton, alcuni di Hinman), quindi probabilmente mi divertirei molto con Coq.

2) Altri hanno fortemente favorito Lisp (Common Lisp, Scheme e Clojure). Da quello che ho capito, sia Common Lisp che Scheme hanno un eccellente materiale introduttivo ( On Lisp e The Reasoned Schemer , SICP ). Il materiale in SICP mi fa propendere per Scheme. In particolare, Scheme through SICP coprirà una diversa strategia di valutazione, l'implementazione della pigrizia e la possibilità di concentrarsi su argomenti come continuazioni, interpreti, calcolo simbolico e così via. Infine, come altri hanno sottolineato, il trattamento del codice / dati da parte di Lisp sarebbe completamente nuovo. Quindi, mi sto appoggiando fortemente all'opzione (2), un Lisp.

3) Terzo, Prolog. Prolog ha una ricchezza di materiale interessante e il suo dominio principale è esattamente quello che mi interessa. Ha una sintassi semplice ed è di facile lettura. Al momento non posso commentare di più, ma dopo aver letto una panoramica di Prolog e aver scremato del materiale introduttivo, si classifica con (2). E sembra che il backtracking di Prolog sia sempre stato violato in Haskell!

4) Tra i linguaggi tradizionali, Python sembra il più interessante. Tim Yates rende le lingue molto attraenti. Apparentemente, Python viene spesso insegnato alle major CS del primo anno; quindi è concettualmente ricco o facile da imparare. Dovrei fare più ricerche.

Grazie a tutti per i vostri consigli! Sembra che un Lisp (Scheme, Clojure), Prolog o un assistente di prova come Coq o Agda siano le lingue principali consigliate.


34
2,5 mesi non sono abbastanza per imparare una lingua in profondità, mi dispiace far scoppiare la bolla.
Woot4Moo

20
È certamente vero. Non volevo insinuare che avessi "imparato" Haskell, qualunque cosa significasse. Volevo dire che mi sento a mio agio nell'usare la lingua. Chiaramente non "smetterò di impararlo".
danportin

10
@Michael: La codifica per la correttezza invece dell'efficienza è qualcosa che mi piacerebbe vedere di più ...
Deniz Dogan,

24
@ Woot4Moo: 2,5 mesi sono un sacco di tempo per "sentirsi a proprio agio" con una lingua, però. Soprattutto se ha familiarità con la logica formale e lavora con concetti astratti dal suo background filosofico. Anche in questo caso sarebbe utile non dover disimparare abitudini da altre lingue.
CA McCann,

8
@gnovice: è stato chiesto molte volte, certamente. Ma questa è la prima volta che incontro qualcuno che ha fatto la sua prima esperienza seria di programmazione con Haskell. È come se la freccia del tempo fosse stata invertita o qualcosa del genere.
Muhammad Alkarouri

Risposte:


85

Vorrei ampliare la mia conoscenza della programmazione. (...) Ho pensato di porre la domanda qui, insieme a diverse disposizioni sul tipo di linguaggio che sto cercando. Alcuni sono soggettivi, altri hanno lo scopo di facilitare la transizione da Haskell.

Sistema di tipo forte. (...) Rende anche più facile ragionare in modo informale sulla correttezza del mio programma. Mi interessa la correttezza, non l'efficienza.

Enfasi sulla ricorsione piuttosto che sull'iterazione. (...)

Forse stai facilitando un po 'troppo la transizione qui, temo. Il sistema di tipi molto severo e lo stile puramente funzionale sono caratteristici di Haskell e praticamente qualsiasi cosa che assomigli a un linguaggio di programmazione tradizionale richiederà un compromesso almeno in parte su uno di questi. Quindi, con questo in mente, ecco alcuni suggerimenti generali volti a mantenere la maggior parte di ciò che sembra ti piaccia di Haskell, ma con qualche cambiamento importante.

  • Ignora la praticità e scegli "più Haskell che Haskell" : il sistema di caratteri di Haskell è pieno di buchi, a causa della non terminazione e di altri compromessi disordinati. Pulisci il casino e aggiungi funzionalità più potenti e otterrai linguaggi come Coq e Agda , in cui il tipo di una funzione contiene una prova della sua correttezza (puoi persino leggere la freccia della funzione ->come implicazione logica!). Questi linguaggi sono stati utilizzati per dimostrazioni matematiche e per programmi con requisiti di correttezza estremamente elevati. Coq è probabilmente il linguaggio più importante dello stile, ma Agda ha un aspetto più Haskell-y (oltre ad essere scritto in Haskell stesso).

  • Ignora i tipi, aggiungi più magia : se Haskell è la stregoneria, Lisp è la magia primordiale e grezza della creazione. I linguaggi della famiglia Lisp (inclusi anche Scheme e Clojure ) hanno una flessibilità quasi senza pari combinata con un minimalismo estremo. I linguaggi hanno essenzialmente nessuna sintassi, scrivendo codice direttamente sotto forma di una struttura dati ad albero; la metaprogrammazione in un Lisp è più facile della non-meta programmazione in alcuni linguaggi.

  • Comprometti un po 'e avvicinati al mainstream : Haskell rientra nella vasta famiglia di linguaggi fortemente influenzati dal ML, a ognuno dei quali potresti probabilmente passare senza troppe difficoltà. Haskell è uno dei più severi quando si tratta di garanzie di correttezza da tipi e uso di stile funzionale, dove gli altri sono spesso stili ibridi e / o fanno compromessi pragmatici per vari motivi. Se vuoi una certa esposizione all'OOP e l'accesso a molte piattaforme tecnologiche tradizionali, Scala su JVM o F #su .NET hanno molto in comune con Haskell fornendo al contempo una facile interoperabilità con le piattaforme Java e .NET. F # è supportato direttamente da Microsoft, ma presenta alcune fastidiose limitazioni rispetto a Haskell e problemi di portabilità su piattaforme non Windows. Scala ha controparti dirette di più del sistema di tipi di Haskell e del potenziale multipiattaforma di Java, ma ha una sintassi più pesante e manca del potente supporto first-party di cui gode F #.

La maggior parte di questi consigli sono menzionati anche in altre risposte, ma si spera che la mia motivazione per loro offra qualche chiarimento.


4
Nella famiglia di Coq e Agda puoi anche guardare Qi II .
Hynek -Pichi- Vychodil

Quali sarebbero i fastidiosi limiti di F # secondo te? Come qualcuno che impara F # nel tempo libero, sono curioso di sapere.
Lucas

7
@ Lucas: Il problema principale contro Haskell spoglio è la mancanza di polimorfismo di tipo superiore e classi di tipo. Oltre a ciò, alcune estensioni specifiche di GHC sono piuttosto carine. Nessuno di questi è un difetto fatale in alcun modo, ma dopo essersi abituato a Haskell sembra un po 'goffo non avere quella roba. Immagina di tornare dal C # moderno all'uso di C # 1.x ...
CA McCann,

@HyneK: Questa lingua Qi 2 a prima vista sembra molto interessante e più flessibile di Coq o Adga. Sembra che l'autore abbia deciso di farla finita. C'è qualche movimento per continuare a lavorare su questa lingua? Non vorrei imparare qualcosa che è già mezzo morto.
Alex

@Alex: sembra che sia continuato come Shen: shenlanguage.org
amindfv

20

Sarò quel ragazzo e suggerirò che stai chiedendo la cosa sbagliata.

Per prima cosa dici che vuoi allargare i tuoi orizzonti. Quindi descrivi il tipo di linguaggio che desideri, ei suoi orizzonti suonano incredibilmente come gli orizzonti che hai già. Non guadagnerai molto imparando la stessa cosa più e più volte.

Ti suggerirei di imparare un Lisp - cioè Common Lisp, Scheme / Racket o Clojure. Sono tutti digitati dinamicamente per impostazione predefinita, ma presentano una sorta di suggerimento sul tipo o una digitazione statica opzionale. Racket e Clojure sono probabilmente le tue migliori scommesse.

Clojure è più recente e ha più haskellismi come l'immutabilità per impostazione predefinita e molte valutazioni pigre, ma è basato sulla Java Virtual Machine, il che significa che ha alcune strane verruche (ad esempio la JVM non supporta l'eliminazione delle chiamate di coda, quindi la ricorsione è gentile di un hack).

Racket è molto più vecchio, ma ha acquisito molto potere lungo la strada, come il supporto dei tipi statici e un focus sulla programmazione funzionale. Penso che probabilmente otterrai il massimo da Racket.

I sistemi macro in Lisps sono molto interessanti e di gran lunga più potenti di qualsiasi cosa vedrai altrove. Vale la pena almeno guardarlo.


3
Eh, da una prospettiva Haskell, il suggerimento sul tipo o la digitazione statica opzionale non sembrano poi così diversi dalla digitazione completamente dinamica. È una mentalità molto diversa. Detto questo, le lingue Lisp-y sono divertenti e sono qualcosa che penso che ogni programmatore dovrebbe dedicare almeno un po 'di tempo all'apprendimento.
CA McCann,

19

Dal punto di vista di ciò che si adatta al tuo maggiore, la scelta più ovvia sembra un linguaggio logico come Prolog o suoi derivati. La programmazione logica può essere eseguita in modo molto ordinato in un linguaggio funzionale (vedere, ad esempio, The Reasoned Schemer ), ma potresti divertirti a lavorare direttamente con il paradigma logico.

Anche un sistema interattivo per dimostrare i teoremi come twelf o coq potrebbe colpire la tua fantasia.


2
Poiché dichiari un interesse per un linguaggio fortemente tipizzato, consiglierei lambdaProlog, un linguaggio di programmazione logica di ordine superiore tipizzato. Un'implementazione compilata è Teyjus - code.google.com/p/teyjus (informativa: ho lavorato su Teyjus).
Zach Snow

18

Ti consiglierei di imparare Coq , che è un potente assistente di prova con sintassi che si sentirà a suo agio per il programmatore Haskell. La cosa bella di Coq è che può essere estratto in altri linguaggi funzionali, incluso Haskell. C'è anche un pacchetto ( Meldable-Heap ) su Hackage che è stato scritto in Coq, aveva proprietà provate sul suo funzionamento, quindi estratto in Haskell.

Un altro linguaggio popolare che offre più potere di Haskell è Agda : non conosco Agda oltre a sapere che è tipizzato in modo dipendente, su Hackage e ben rispettato dalle persone che rispetto, ma queste sono ragioni sufficienti per me.

Non mi aspetto che nessuno di questi sia facile. Ma se conosci Haskell e vuoi passare a un linguaggio che dia più potere del sistema di tipi Haskell, allora dovrebbero essere considerati.


1
Agda suona come il naturale "passo successivo" di Haskell.
Deniz Dogan

5
Vale anche la pena notare che se, come laureato in filosofia, ha molta esperienza con la logica formale, gli assistenti alla prova in stile Curry-Howard potrebbero benissimo essere meno sconcertanti per lui di quanto lo sarebbero per la maggior parte dei programmatori veterani!
CA McCann,

11

Dato che non hai menzionato alcuna restrizione oltre ai tuoi interessi soggettivi e hai enfatizzato `` gratificante per imparare '' (beh, ok, ignorerò la restrizione di digitazione statica), suggerirei di imparare alcune lingue con paradigmi diversi e preferibilmente sono "esemplari" per ciascuno di essi.

  • Un dialetto Lisp per il concetto di codice come dati / omoiconicità e perché sono buoni, se non i migliori, esempi di linguaggi di programmazione funzionali dinamici (più o meno rigidi)
  • Prolog come linguaggio di programmazione logica predominante
  • Smalltalk come l'unico vero linguaggio OOP (interessante anche per il suo approccio solitamente estremamente incentrato sull'immagine)
  • forse Erlang o Clojure se sei interessato a linguaggi forgiati per la programmazione concorrente / parallela / distribuita
  • Avanti per la programmazione orientata allo stack
  • ( Haskell per una programmazione pigra di tipo statico funzionale rigorosa)

Soprattutto Lisps (CL non tanto quanto Scheme) e Prolog (e Haskell) abbracciano la ricorsione.

Anche se non sono un guru in nessuna di queste lingue, ho passato un po 'di tempo con ognuna di loro, ad eccezione di Erlang e Forth, e tutti mi hanno dato esperienze di apprendimento che aprono gli occhi e interessanti, poiché ognuno si avvicina alla risoluzione dei problemi da una prospettiva diversa .

Quindi, anche se può sembrare che abbia ignorato la parte relativa al fatto che non hai tempo per provare alcune lingue, penso piuttosto che il tempo trascorso con nessuna di queste non sarà sprecato e dovresti dare un'occhiata a tutte.


Non potevo sopportare le restrizioni di Erlang che coinvolgevano i tutori;)
gorsky

10

Che ne dici di un linguaggio di programmazione orientato allo stack ? Cat colpisce i tuoi punti più alti. È:

  • Digitato staticamente con inferenza di tipo.
  • Ti fa ripensare a concetti di linguaggi imperativi comuni come il loop. L'esecuzione condizionale e il ciclo vengono gestiti con combinatori .
  • Appagante: ti costringe a comprendere un altro modello di calcolo. Ti offre un altro modo per pensare e scomporre i problemi.

Il dottor Dobbs ha pubblicato un breve articolo su Cat nel 2008 anche se la lingua è leggermente cambiata.


10

Se vuoi un Prolog forte (er) ly tipizzato, Mercury è una scelta interessante. Mi sono dilettato in passato e mi è piaciuta la diversa prospettiva che mi ha dato. Ha anche modificazione (quali parametri devono essere liberi / fissi) e determinismo (quanti risultati ci sono?) Nel sistema dei tipi.

Clean è molto simile a Haskell, ma ha una tipizzazione univoca, che viene utilizzata come alternativa alle Monadi (più specificamente, la monade IO). La tipizzazione di unicità fa anche cose interessanti per lavorare con gli array.



8

Nonostante il suo fallimento nel soddisfare uno dei tuoi criteri principali (digitazione statica *), ho intenzione di sostenere Python. Ecco alcuni motivi per cui penso che dovresti dare un'occhiata:

  • Per un linguaggio imperativo, è sorprendentemente funzionale. Questa è stata una delle cose che mi ha colpito quando l'ho imparato. Prendiamo ad esempio le liste di comprensione . Ha lambda, funzioni di prima classe e molte composizioni di ispirazione funzionale su iteratori (mappe, pieghe, cerniere ...). Ti dà la possibilità di scegliere qualunque paradigma si adatti meglio al problema.
  • IMHO, è, come Haskell, bello da codificare. La sintassi è semplice ed elegante.
  • Ha una cultura che si concentra sul fare le cose in modo diretto, piuttosto che concentrarsi troppo minuziosamente sull'efficienza.

Capisco se stai cercando qualcos'altro però. La programmazione logica, ad esempio, potrebbe fare al caso tuo, come altri hanno suggerito.


* Presumo tu intenda la digitazione statica qui, dal momento che vuoi dichiarare i tipi. Tecnicamente, Python è un linguaggio fortemente tipizzato, dal momento che non puoi interpretare arbitrariamente, diciamo, una stringa come un numero. È interessante notare che esistono derivati ​​Python che consentono la digitazione statica, come Boo .


Un sistema di caratteri forti non significa necessariamente solo digitazione "statica".
Deniz Dogan

+1 vedi anche il mio commento sulla risposta di larsmans. Ma fai attenzione a pubblicizzare Python come piuttosto funzionale. Ad esempio, le espressioni del generatore sono solitamente preferite a map, filterecc. Tuttavia, i generatori e le espressioni del generatore risulteranno familiari a qualcuno che conosce la valutazione pigra e le suddette funzioni.

16
Veramente? Penso che Python per lo più sembri particolarmente funzionale alle persone che non hanno fatto molta programmazione funzionale. Ho usato sia Python che Haskell una discreta quantità, e sebbene Python sia un bel linguaggio e certamente abbia preso in prestito alcune cose dai linguaggi funzionali, è ancora imperativo al 99%.
CA McCann,

@camccann Hai ragione: la mia prospettiva è diversa, motivo per cui lo offro solo come alternativa interessante. Come persona che ha imparato per prima la programmazione imperativa, apprezzo che Python mi consenta di usare tecniche funzionali dove sono appropriate ed evitarle dove qualcos'altro ha senso. Non sto dicendo che "è" funzionale, ma solo che rappresenta un buon compromesso.
Tim Yates,

Le abitudini apprese da Haskell possono renderti un programmatore Python molto migliore di altri che lo hanno imparato come prima lingua.
u0b34a0f6ae

8

Ti consiglierei Erlang. Non è un linguaggio digitato forte e dovresti provarlo. È un approccio molto diverso alla programmazione e potresti scoprire che ci sono problemi in cui la digitazione forte non è lo strumento migliore (TM). Ad ogni modo Erlang ti fornisce strumenti per la verifica del tipo statico (typer, dialyzer) e puoi usare una digitazione forte sulle parti in cui ne ottieni benefici. Può essere un'esperienza interessante per te ma preparati, sarà una sensazione molto diversa. Se stai cercando un "paradigma concettualmente interessante" puoi trovarli in Erlang, passaggio di messaggi, separazione della memoria invece condivisione, distribuzione, OTP, gestione e propagazione degli errori invece di "prevenzione" degli errori e così via. Erlang può essere molto lontano dalla tua attuale esperienza, ma ti fa ancora il solletico se hai esperienza con C e Haskell.


8

Data la tua descrizione, suggerirei Ocaml o F # .

La famiglia ML è generalmente molto buona in termini di un sistema di tipo forte. Anche l'enfasi sulla ricorsione, accoppiata con il pattern matching, è chiara.

Dove sono un po 'titubante è nella parte gratificante dell'apprendimento . Impararli è stato gratificante per me, senza dubbio. Ma date le tue restrizioni e la tua descrizione di ciò che vuoi, sembra che tu non stia effettivamente cercando qualcosa di molto più diverso da Haskell.

Se non avessi posto le tue restrizioni, ti avrei suggerito Python o Erlang , che ti porterebbero entrambi fuori dalla tua zona di comfort.


6

Nella mia esperienza, una forte digitazione + enfasi sulla ricorsione significa un altro linguaggio di programmazione funzionale. Poi di nuovo, mi chiedo se sia molto gratificante, dato che nessuno di loro sarà "puro" come Haskell.

Come altri poster hanno suggerito, Prolog e Lisp / Scheme sono carini, anche se entrambi sono digitati dinamicamente. Molti grandi libri con un forte "gusto" teorico per loro sono stati pubblicati su Scheme in particolare. Dai un'occhiata a SICP , che trasmette anche molta saggezza informatica generale (interpreti meta-circolari e simili).


4
+1 per il primo paragrafo, esattamente quello che ho pensato quando ho letto la domanda. Per il bene di imparare cose nuove, suggerirei un linguaggio imperativo moderno, come Python, soprattutto perché non è quello a cui era abituato l'OP (digitazione dinamica, iteratori ovunque, ecc.). Ha anche concetti avanzati molto interessanti come metaclassi o generatori (che sono sorprendentemente simili a liste pigre) / espressioni di generatore (che servono come generalizzazione di comprensioni di lista + generatori). Inoltre, detta e imposta regole di comprensione.

3
@delnan: Haskell ha anche le liste di comprensione e generatori / iteratori possono essere facilmente espressi in Haskell utilizzando il tipo di elenco standard di Haskell. Quindi le maggiori differenze tra i due linguaggi sarebbero, a mio parere, la programmazione orientata agli oggetti e (molto spesso) strutture di dati impure come i dizionari.
Deniz Dogan,

1
@ Deniz Dogan: non dimenticare la mancanza di dichiarazioni e un corretto ambito lessicale in Python.
Fred Foo,


5

Potresti iniziare a esaminare Lisp .

Anche il prologo è un linguaggio interessante.


5

Se decidi di allontanarti dalla tua preferenza per un sistema di tipi, potresti essere interessato al linguaggio di programmazione J. È eccezionale per come enfatizza la composizione delle funzioni. Se ti piace lo stile senza punti in Haskell, la forma tacita di J sarà gratificante. L'ho trovato straordinariamente stimolante, soprattutto per quanto riguarda la semantica.

È vero, non si adatta ai tuoi preconcetti su ciò che desideri, ma dagli un'occhiata. Solo sapere che è là fuori vale la pena scoprirlo. L'unica fonte di implementazioni complete è J Software, jsoftware.com.


0

Vai con uno dei flussi principali. Date le risorse disponibili, la futura commerciabilità delle tue abilità, il ricco ecosistema di sviluppatori, penso che dovresti iniziare con Java o C # .


14
Rispetto a Haskell, entrambi sono lingue piuttosto scadenti IMO.
missingfaktor

9
Chiedere a un Haskeller di trasferirsi a Java è come chiedere a Bill Gates di trasferirsi nei bassifondi. : - /
missingfaktor

1
+1 Per aver suggerito qualcosa che ti farà sicuramente declassare. Java e C # hanno ecosistemi piacevoli e sono entrambi molto consigliati per un lavoro serio. Come vantaggio decisivo, puoi sfruttare la tua conoscenza di Haskell (, Java e C #) quando usi Clojure su JVM o F # su CLR.
ponzao

6
@ponzao: Urgh, no, suggerire che qualcuno passi da Haskell a Java o C # è semplicemente orribile e crudele. Scala, F # e Clojure sono linguaggi molto più belli con tutti gli stessi vantaggi che derivano dall'esecuzione su JVM / CLR.
CA McCann,

5
Per una filosofia analitica, Java o C # importanti sono una perdita di tempo.
MaD70

0

Ottima domanda: me la sono posta di recente dopo aver passato diversi mesi a godermi Haskell, anche se il mio background è molto diverso (chimica organica).

Come te, C e simili sono fuori discussione.

Ho oscillato tra Python e Ruby come i due pratici linguaggi di scripting oggi (muli?) Che entrambi hanno alcuni componenti funzionali per rendermi felice. Senza avviare qui alcun dibattito su Rubyist / Pythonist, ma la mia risposta pragmatica personale a questa domanda è:

Impara quello (Python o Ruby) che per primo hai una scusa per applicare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.