Sarebbe ok se decidessi di scrivere tutto il mio Ruby come se fosse Haskell?

10

Dato che Ruby ha una buona lista di funzionalità operative integrate - riduce, mappa, seleziona, raccoglie ecc. Ha Procs, Blocks e Lambdas, e ha un bel supporto per l'iterazione (la famiglia each ), sarebbe un brutto decisione progettuale se tento di scrivere tutta la mia roba Ruby nel modo più puramente funzionale possibile? Approposito per il codice che ha un I / O minimo o nullo (quindi effetti collaterali meno evidenti)?

Ho imparato 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 di Haskell vi scorre dentro ( beh, Ruby non ha preso in prestito / imparato molto da esso in primo luogo?)

L'orientamento costruttivo è benvenuto ...

    
posta nemesisfixx 27.04.2011 - 01:35
fonte

5 risposte

15

Ho fatto questo con Python. Trovo che sia complicato scrivere in uno stile funzionale puro ereditario 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_order il modo Haskell in python sarà sia dettagliato (dal momento che python non supporta gli idiomi necessari molto bene) e lento (spazio lineare invece dello spazio costante di Haskell a causa della pigrizia).

Tuttavia, ho avuto successo nella creazione di programmi python con l'organizzazione funzionale e un'implementazione idiomatica di ciascuna funzione. L'idea che questo sia un buon modo per programmare è in realtà la tesi dietro il mio progetto codecatalog . Quindi, i miei componenti sono orientati su astrazioni e funzioni (con pura interfaccia ) che operano su di essi, piuttosto che su 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, dal momento che sono ancora un devoto di Haskell.

Quindi direi che la risposta alla tua domanda è kinda . Usa le tue radici funzionali per aiutarti a pensare, ma non esagerare. Per esempio. simulare liste pigre in Ruby solo per ragioni idiomatiche probabilmente sarà più un problema che ne vale la pena.

    
risposta data 27.04.2011 - 02:27
fonte
6

Puoi scrivere il codice Ruby in stile funzionale come se fosse Scheme, non Haskell. Per scriverlo come se fosse Haskell, sarebbe necessario un sistema di tipo Haskell, oltre a una valutazione pigmentaria pervasiva.

    
risposta data 24.06.2011 - 18:39
fonte
1

Ho trovato comprensione della programmazione funzionale, e Haskell in particolare, per essere utile a me in determinate situazioni che ho incontrato in Ruby. Ma più imparo Haskell, più mi rendo conto di quanto lontano Ruby sia mai stato in grado di somigliare molto a Haskell.

La situazione di caricamento del modulo / codice è terribile, per prima cosa. L'interprete corrente non ha attivato l'ottimizzazione della coda, quindi non è possibile ricorrere alla ricorsione come in Haskell. E una volta entrato in Monads, non c'è davvero paragone tra i livelli di astrazione che puoi ottenere in Haskell vs Ruby.

Se sei interessato, ho pubblicato alcuni codici di confronto Ruby / Haskell su gist.github.com come ho imparato.

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

    
risposta data 27.04.2011 - 03:40
fonte
0

Direi "sì". Quello di cui (penso) stai parlando è l'influenza programmazione funzionale nel linguaggio rubino. Il paradigma funzionale ha alcuni concetti davvero carini che si complimentano o si sovrappongono all'oggetto orientato (senza effetti collaterali, in particolare).

Il bello del rubino è che ti permette di scrivere in codice uno stile lineare, orientato all'oggetto o funzionale, o una combinazione di questi. E il tuo script semplice e lineare può trasformarsi in OO / stile funzionale se e quando aumenta la complessità.

    
risposta data 27.04.2011 - 02:16
fonte
0

Dipende se collaborerai con gli altri. Se stai lavorando sul codice da solo, usa lo stile con cui ti senti più a tuo agio. Tuttavia, se stai lavorando con altri programmatori di Ruby, potrebbero non essere usati 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 passati a Ruby, potresti non avere questo problema.

    
risposta data 24.06.2011 - 18:59
fonte

Leggi altre domande sui tag