Ruby è a oggetti fino al midollo, ma ha strumenti funzionali eleganti per comporre trasformazioni in modo leggibile.

# then (o yield_self): incanala un valore in una pipeline
risultato = "  ale@Mail.IT "
  .then(&:strip)
  .then(&:downcase)
  .then { |s| s.split("@").first }
# => "ale"

# curry: fissa gli argomenti uno alla volta
somma = ->(a, b, c) { a + b + c }.curry
somma[1][2][3]        # => 6
aggiungi10 = somma[10]
aggiungi10[5][5]      # => 20

then (alias yield_self) passa l'oggetto a un blocco e ne restituisce il risultato: incatena trasformazioni senza variabili intermedie, leggendosi come una pipeline. curry trasforma una funzione a più argomenti in una serie di funzioni a un argomento, così puoi "pre-caricare" alcuni valori e riusare il resto.

Non trasformano Ruby in Haskell, ma per pulire una stringa o costruire funzioni specializzate sono comodissimi. La programmazione funzionale non è un dogma: sono strumenti da tenere nella cassetta, da tirare fuori quando rendono il codice più chiaro.