Andrebbe bene se decidessi di scrivere tutto il mio Ruby come se fosse Haskell?


10

Dato che Ruby ha buone capacità operative di elenco integrate: riduci, mappa, seleziona, raccogli ecc. Ha Procs, Blocks e Lambdas e ha un buon supporto di iterazione (la eachfamiglia), sarebbe una cattiva decisione di progettazione se provassi a scrivere tutte le mie cose su Ruby nel modo più puro-funzionale possibile? Soprattutto per il codice che ha un I / O scarso o nullo (quindi effetti collaterali meno evidenti)?

Sto imparando Haskell (chiamato il "vero" linguaggio di Hacker), e sono innamorato del suo modo di fare le cose - amo Ruby, ma penso che possa essere ancora più divertente quando più spirito Haskell vi scorre dentro (beh, no Ruby prende in prestito / impara molto da esso in primo luogo?)

L'orientamento costruttivo è il benvenuto ...


13
Perché non scrivere in Haskell allora?

1
Scriverei da solo in Haskell, ma Ruby non è poi così male da meritare di essere buttato via completamente. Mi piace il fatto che posso usarlo durante lo scripting e per i molti rapidi esperimenti che mi piace hackerare insieme quando apprendo cose AI. Ma probabilmente anche perché ho appena iniziato a studiare Haskell, alla fine potresti seguire il tuo consiglio :-)
nemesisfixx,

2
Non capisco perché stai chiedendo il permesso di Stack Overflow. Se stai scrivendo codice che condividerai con gli altri in una squadra, dovrai comunque coordinare i tuoi stili di codifica. Altrimenti, che importa?
Mike Daniels,

Perché sto chiedendo SO? perché rispetto l'opinione sincera di hacker e programmatori esperti. Potrebbero esserci dei benefici nell'usare un approccio alla programmazione puramente funzionale che le menti esperte potrebbero condividere con me (e altri come me).
nemesisfixx,

Considerando che ci sono ragioni oggettive per "no", questa è una domanda legittima.
Andrew Grimm,

Risposte:


16

L'ho fatto con Python. Trovo che sia ingombrante scrivere in uno stile funzionale ereditario puro in un linguaggio che non è stato progettato per questo. Ad esempio, confronta le due definizioni di in_order :

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

Scrivere in in_ordermodo Haskell in Python sarà sia prolisso (poiché Python non supporta molto bene gli idiomi necessari) sia lento (spazio lineare invece dello spazio costante di Haskell a causa della pigrizia).

Tuttavia, ho avuto successo nel creare programmi Python con organizzazione funzionale e un'implementazione idiomatica di ciascuna funzione. L'idea che questo sia un buon modo di programmare è in realtà la tesi alla base del mio progetto di codecatalog . Quindi, i miei componenti sono orientati attorno alle astrazioni e alle funzioni (con pura interfaccia ) che operano su di esse, piuttosto che alle classi con stato, e si stanno unendo bene. In effetti, il codice organizzato in questo modo sembra essere più flessibile da riutilizzare rispetto al codice organizzato con le classi. Questo potrebbe essere un pregiudizio personale, tuttavia, poiché sono ancora un devoto di Haskell.

Quindi direi che la risposta alla tua domanda è un po ' . Usa le tue radici funzionali per aiutarti a pensare, ma non esagerare. Per esempio. simulare liste pigre in Ruby solo per amor di idioma probabilmente sarà più un problema di quanto valga la pena.


In qualche modo la tua descrizione mi ha fatto pensare a Pascal.
Rasjani,

@rasjani, oh? Qualche ragione per cui?

Non lo so, forse la sua mancanza di comprensione dell'inglese o di ciò che hai descritto si adatta a come (almeno) le cose sono state sistemate / strutturate in unità pasquali. Solo una sorta di connessione mentale, potresti non avere alcuna connessione reale a causa della prima opzione;)
rasjani

1
L'affermazione "spazio lineare invece dello spazio costante di Haskell dovuto alla pigrizia" non è accurata. La pigrizia implica ancora un ordine lineare. Capisco il tuo punto comunque.

3
@aromero, però non capisco il tuo. Cosa c'entra l'ordine con esso? Lo spazio costante viene dalla spazzatura di Haskell che raccoglie i capi dell'elenco dei confronti dopo andaverli consumati; si comporterà come un ciclo. Considerando che l'elenco di confronti di Python dovrà essere generato per intero prima che l'analogo di andne veda uno (a meno che non si utilizzino generatori ... che suppongo sia una possibilità).

7

Puoi scrivere il codice Ruby in stile funzionale come se fosse Scheme, non Haskell. Per scriverlo come se fosse Haskell, avrebbe bisogno di un sistema di tipo simile a Haskell, oltre a una valutazione pigra pervasiva.


1

Ho scoperto che comprendere la programmazione funzionale, e in particolare Haskell, mi è stato utile in certe situazioni che ho incontrato in Ruby. Ma più imparo Haskell, più mi rendo conto di quanto sia lontano Ruby dall'essere in grado di essere molto simile a Haskell.

La situazione di caricamento del modulo / codice è spaventosa, per prima cosa. Nell'interprete corrente non è attivata l'ottimizzazione delle chiamate in coda, quindi non è possibile utilizzare la ricorsione come in Haskell. E una volta che entri in Monads, non c'è davvero alcun confronto tra i livelli di astrazione che puoi raggiungere in Haskell vs Ruby.

Se sei interessato, ho pubblicato alcuni codici di confronto su Ruby / Haskell su gist.github.com mentre sto imparando.

La tecnica che ho portato a Ruby che ha funzionato al meglio è stata trovare funzioni pure dove posso, ed è quello che sembra che tu stia cercando di fare.


In uno dei miei test Smalltalk: self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g]). Non c'è alcun motivo per cui non puoi usare consapevolmente le monadi, al contrario di usarle senza nemmeno sapere che le stai usando (come le liste).
Frank Shearar,

0

Direi di si". Ciò che (penso) di cui stai parlando è l' influenza della programmazione funzionale nel linguaggio ruby. Il paradigma funzionale ha alcuni concetti davvero carini che si completano o si sovrappongono con oggetti orientati (senza effetti collaterali, in particolare).

La cosa grandiosa di ruby ​​è che ti permette di codificare in uno stile lineare, orientato agli oggetti o funzionale, o in una combinazione di questi. E il tuo semplice script lineare può trasformarsi in OO / stile funzionale se e quando aumenta la complessità.


0

Dipende se collaborerai con gli altri. Se stai lavorando sul codice da solo, usa lo stile che preferisci. Tuttavia, se stai lavorando con altri programmatori Ruby, potrebbero non essere utilizzati per uno stile di programmazione puramente funzionale e quindi essere confusi dal tuo codice. Inoltre, se i tuoi collaboratori sono anche programmatori Haskell che sono migrati su Ruby, potresti non avere questo problema.

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.