Feature #6817
openPartial application
Description
I know that what I propose here is a significant change to Ruby, but it's part of my ongoing quest to get some more functional programming features into Ruby (see also #4539 and #6373).
I was wondering if it would make sense to maybe introduce partial application to Ruby? So that instead of
(1..3).map { |i| i + 2 }
or the somewhat unwieldy
(1..3).map(&2.method(:+))
one could just write
(1..3).map(&2.+)
which I think has a quite rubyish feel to it. I have a POC implementation in Ruby (I tried it with various Fixnum methods) over at my blog, but that was just a quick hack and obviously I don't want to monkey-patch every method with arity 1, but it was a  nice way of exploring possible syntax.
        
           Updated by shyouhei (Shyouhei Urabe) over 13 years ago
          Updated by shyouhei (Shyouhei Urabe) over 13 years ago
          
          
        
        
      
      - Description updated (diff)
        
           Updated by yhara (Yutaka HARA) about 13 years ago
          Updated by yhara (Yutaka HARA) about 13 years ago
          
          
        
        
      
      - Target version changed from 2.0.0 to 2.6
        
           Updated by ko1 (Koichi Sasada) over 12 years ago
          Updated by ko1 (Koichi Sasada) over 12 years ago
          
          
        
        
      
      - Assignee set to matz (Yukihiro Matsumoto)
This ticket is related to [ruby-core:52797] [ruby-trunk - Feature #7939]?
(definitely no?)
Basically, I like this proposal.
But I'm not sure this notation can be acceptable.
FYI: Scheme has similar, but more flexible proposal:
http://srfi.schemers.org/srfi-26/srfi-26.html
(cut cons (+ a 1) <>) is the same as (lambda (x2) (cons (+ a 1) x2))
(cut list 1 <> 3 <> 5) is the same as (lambda (x2 x4) (list 1 x2 3 x4 5))
(cut list) is the same as (lambda () (list))
(cut list 1 <> 3 <...>) is the same as (lambda (x2 . xs) (apply list 1 x2 3 xs))
(cut <> a b) is the same as (lambda (f) (f a b))
Of course, it is not ruby's way. This is only sample of the other language.
        
           Updated by citizen428 (Michael Kohl) about 11 years ago
          Updated by citizen428 (Michael Kohl) about 11 years ago
          
          
        
        
      
      Koichi Sasada wrote:
Basically, I like this proposal.
But I'm not sure this notation can be acceptable.
In that case, how about making Symbol#to_proc accept additional arguments?
(1..3).map(:+, 2) 
The syntax would be very straightforward, but it doesn't go well with the current implementation of Symbol#to_proc's proc cache. Also this does go away a bit from the original point of partial application, though tbh this sort of scenario is what I mostly had in mind anyway.
        
           Updated by nobu (Nobuyoshi Nakada) about 11 years ago
          Updated by nobu (Nobuyoshi Nakada) about 11 years ago
          
          
        
        
      
      - Description updated (diff)
Michael Kohl wrote:
In that case, how about making
Symbol#to_procaccept additional arguments?(1..3).map(:+, 2)
It doesn't relate to Symbol#to_proc.
        
           Updated by k0kubun (Takashi Kokubun) over 8 years ago
          Updated by k0kubun (Takashi Kokubun) over 8 years ago
          
          
        
        
      
      - Related to Feature #7939: Alternative curry function creation added
        
           Updated by k0kubun (Takashi Kokubun) over 8 years ago
          Updated by k0kubun (Takashi Kokubun) over 8 years ago
          
          
        
        
      
      - Related to Feature #13765: Add Proc#bind added
        
           Updated by naruse (Yui NARUSE) almost 8 years ago
          Updated by naruse (Yui NARUSE) almost 8 years ago
          
          
        
        
      
      - Target version deleted (2.6)
        
           Updated by hsbt (Hiroshi SHIBATA) over 1 year ago
          Updated by hsbt (Hiroshi SHIBATA) over 1 year ago
          
          
        
        
      
      - Status changed from Open to Assigned