

 This page uses content from Wikipedia. The original article was at Currying. The list of authors can be seen in the page history. As with Rosetta Code, the text of Wikipedia is available under the GNU FDL. (See links for details on variance)



Task

Create a simple demonstrative example of Currying in a specific language.

Add any historic details as to how the feature made its way into the language.




-- curry :: (Script|Handler) -> Script
on curry(f)
    script
        on |λ|(a)
            script
                on |λ|(b)
                    |λ|(a, b) of mReturn(f)
                end |λ|
            end script
        end |λ|
    end script
end curry
 
 
-- TESTS ----------------------------------------------------------------------
 
-- add :: Num -> Num -> Num
on add(a, b)
    a + b
end add
 
-- product :: Num -> Num -> Num
on product(a, b)
    a * b
end product
 
-- Test 1.
curry(add)
 
-->  «script»
 
 
-- Test 2. 
curry(add)'s |λ|(2)
 
--> «script»
 
 
-- Test 3.
curry(add)'s |λ|(2)'s |λ|(3)
 
--> 5
 
 
-- Test 4. 
map(curry(product)'s |λ|(7), enumFromTo(1, 10))
 
--> {7, 14, 21, 28, 35, 42, 49, 56, 63, 70}
 
 
-- Combined:
{curry(add), ¬
    curry(add)'s |λ|(2), ¬
    curry(add)'s |λ|(2)'s |λ|(3), ¬
    map(curry(product)'s |λ|(7), enumFromTo(1, 10))}
 
--> {«script», «script», 5, {7, 14, 21, 28, 35, 42, 49, 56, 63, 70}}
 
 
-- GENERIC FUNCTIONS ----------------------------------------------------------
 
-- enumFromTo :: Int -> Int -> [Int]
on enumFromTo(m, n)
    if n < m then
        set d to -1
    else
        set d to 1
    end if
    set lst to {}
    repeat with i from m to n by d
        set end of lst to i
    end repeat
    return lst
end enumFromTo
 
-- map :: (a -> b) -> [a] -> [b]
on map(f, xs)
    tell mReturn(f)
        set lng to length of xs
        set lst to {}
        repeat with i from 1 to lng
            set end of lst to |λ|(item i of xs, i, xs)
        end repeat
        return lst
    end tell
end map
 
-- Lift 2nd class handler function into 1st class script wrapper 
-- mReturn :: Handler -> Script
on mReturn(f)
    if class of f is script then
        f
    else
        script
            property |λ| : f
        end script
    end if
end mReturn