Fork me on GitHub
#clojure-italy
<
2017-09-05
>
kors08:09:06

Oh buongiorno.

kors08:09:42

Come implementereste un group-by sulle chiavi di una mappa a basso livello? Usando solo map, filter, le hof di base?

danielneal08:09:44

puoi usare reduce?

mdallastella08:09:25

@kors intendi i valori delle chiavi, giusto?

reborg08:09:37

hey @danieleneal tutto ok! Stai imparando l'italiano?

reborg08:09:20

@kors puoi postare esempio di input/output?

kors08:09:30

elenco di nomi : ["Anna", "Carla", "Angela", "Chiara", "Emma", "Maria", "Sara"]

kors08:09:22

risultato :

{
            :4 ["Anna", "Emma", "Sara"],
            :5 ["Carla", "Maria"],
            :6 ["Angela", "Chiara"]
}

bronsa08:09:44

:<number> non e` una keyword valida FWIW

kors08:09:47

scusate le virgole ma non viene da clojure 😄

kors08:09:11

sì sì, però avete capito il concetto

kors08:09:32

è un problema anche banale.

bronsa08:09:54

beh, non ci sono molti modi di risolverlo migliori di usare esattamente l'implementazione di group-by

bronsa08:09:08

un reduce con un hashmap come accumulator

kors08:09:48

@bronsa mi puoi fare un esempio del secondo caso?

bronsa08:09:10

(reduce (fn [acc el] (update acc (count el) conj el)) m)

bronsa08:09:43

o (fnil conj []) se preferisci un vector a una list

bronsa08:09:27

group-by di clojure.core usa un vector

bronsa08:09:59

perche` ritorna gli elementi in ordine

kors08:09:35

ok era quello di cui avevo bisogno

kors08:09:02

La discussione è nata con un amico haskelliano della mia community

kors08:09:41

Lui lavorando in altri linguaggi, quando ha un problema da risolvere, lo risolve in haskell e poi porta la soluzione nel linguaggio x. Ho tentato di fare la stessa cosa con clj. Il linguaggio target è php che non ha nessuna hof per gruppare. Avevo risolto con una lambda ricorsiva ma essendo codice per degli studenti mi sembrava un po' troppo, e poi è molto "costosa" come soluzione in php.

bronsa08:09:15

>quando ha un problema da risolvere, lo risolve in haskell e poi porta la soluzione nel linguaggio x non mi sembra minimamente un approccio ottimale, onestamente

kors08:09:40

approcciare FP con linguaggi non FP non è comunque un approccio ottimale 😄

kors08:09:03

Non è che mi convinca (infatti è un auto-test)

kors08:09:21

Ma se vuoi una soluzione FP, quella costruita in haskell è per forza di cose FP

bronsa08:09:35

beh, in natural languages lo step di traduzione da linguaggio piu` familiare a linguaggio meno familiare, per esempio, e` visto come uno step extra da cercare di evitare

bronsa08:09:51

e in linguaggi di programmazione mi sembra lo stesso livello di overhead cognitivo

reborg09:09:21

@danieleneal grazie dei compilmenti 🙂

bronsa09:09:38

se devi usare haskell per forzarti a scrivere una soluzione fp da poi portare in un altro linguaggio.. magari non hai internalizzato bene l'approccio fp?

bronsa09:09:33

(chiaramente non e` un giudizio sul tuo amico, non conoscendolo potrebbe essere un guru di HS, semplicemente una mia opinione sull'approccio)

reborg09:09:12

@kors sembra un (group-by count ["Anna", "Carla", "Angela", "Chiara", "Emma", "Maria", "Sara"]) ?

bronsa09:09:51

si` chiaro, la domanda era come implementarlo non avendo group-by definito

kors09:09:03

@bronsa tuttavia quando programmo in php ho uno stile completamente diverso da quando programmo in clj. Clj ha sicuramente cambiato molto il mio stile, ma in linguaggi che non supportano FP il mio cervello tende comunque a mettere il pilota automatico... In php il supporto FP è veramente molto scarso e per lo più inefficiente. Alcune soluzioni funzionali so proprio da evitare perché il corrispettivo imperativo è molto più efficiente. L'approccio in realtà mi sembra controproducente più che altro perché non credo si sviluppi una vera nozione delle possibilità funzionali del linguaggio target.

kors09:09:28

@reborg sì non esiste group-by in php.

bronsa09:09:38

>quando programmo in php ho uno stile completamente diverso da quando programmo in clj eh boh, mi sembra una feature piu` che un bug

reborg09:09:57

uh troppo complicato per me

bronsa09:09:59

cercare di shoehornare un particolare approccio in un linguaggio che non ha buon supporto per quello stile di programmazione non m'e` mai sembrato troppo sensato

kors09:09:12

@bronsa e hai di nuovo ragione! è una feature in effetti ma non quando devi spiegare il paradigma funzionale a degli studenti php 🙂

kors09:09:17

È un caso tutto speciale

bronsa09:09:22

certo, capisco

kors09:09:59

Il funzionale comunque ti cambia e ti aiuta anche nei linguaggi imperativi come php. In questo senso mi sono chiesto se l'approccio di Vitalij potesse essere utile. Tuttosommato direi che mi ha un po' confuso, quindi forse no. Ero curioso anche perché non ho attualmente molte occasioni di lavorare con clj e poterci giocare ogni tanto fa sempre piacere.

kors09:09:37

Del resto, quello che fai in clj co na riga di codice è imparagonabile nella maggior parte degli altri linguaggi 😄

reborg09:09:53

Questo e' uno step sotto a reduce. Forse ha senso nella discussione fp in php?

(loop [[word & more] ["Anna", "Carla", "Angela", "Chiara", "Emma", "Maria", "Sara"] res {}] 
  (if word 
    (recur 
      more 
      (assoc res (count word) (conj (get res (count word) []) word))) 
      res))

reborg09:09:58

loop-recur e' eliminabile, cosi' come destructuring

reborg09:09:03

se php ha ricorsione (immagino di si') e' pur sempre un approccio funzionale e non imperativo

kors09:09:08

@reborg così a occhio è stato più o meno il mio approccio. La ricorsività però è insicura. Php ha un limite di nesting che con un elenco più grande avrebbe generato un errore.

kors09:09:56

e per quanto sia gradevole la tua implementazione, in php era orripilante 😄

reborg09:09:33

anche Java ha quel limite (e Clojure di conseguenza, se non usi loop-recur che riscrive il loop)

kors09:09:58

È ragazzi questi sono i miei guai tentando di diffondere il verbo funzionale a Roma 🙂

kors09:09:29

Un modo di risolverla in php è con un generator ricorsivo... Che itera ricorsivamente senza nestare. Però è un argomento avanzato per me, figurati per chi non ha idea di cosa sia un generator (gli studenti)

reborg09:09:46

capisco, in bocca al lupo... c'e' sempre http://www.pharen.org 🙂

kors09:09:05

ah ah ah ah 😄

kors09:09:10

fichissimo, non lo conoscevo!

kors09:09:18

In produzione non mi permetteranno mai di usarlo 😄

kors09:09:29

Ho più chance di lavorare direttamente con clj 😉

kors09:09:10

Grazie ragazzi

reborg10:09:00

Parlando di W. Byrd (di miniKanren e reasoned-schemer fame), pare che gli dovro' insegare ad usare Clojure transducers perche' si e' iscritto al mio workshop... 🙀

bronsa10:09:31

ma sei ad icfp?

bronsa11:09:19

a saperlo.. ero ad oxford domenica a prendere una birra con un amico che ha tenuto un workshop a FSCD

reborg11:09:20

ci saro' solo venerdi' e sabato, fammi sapere se torni

bronsa11:09:07

venerdì ultimo giorno di lavoro e poi sabato torno in Italia fino a ottobre

reborg11:09:49

non male come programma! Organizza una clj-beer quando sei la' 🙂

reborg12:09:30

una birra con i clojuristi italiani (a beer with the italian clojurists), quando va in Italia (when he goes back to italy)

magomimmo12:09:26

se la birrata la fate a milano o dintorni, cerchero' di esserci anche io (ma non sono un grande bevitore)

reborg12:09:01

spetta che qua sto vendendo una birrata sulla testa di qualcun'altro 🙂

bronsa12:09:15

beh se si riesce a organizzare qualcosa perche` no :)

reborg12:09:46

bravi, se la fate nel WE del 20-22 forse riesco a pigliar n'aereo