0
0
Rubyprogramming~20 mins

Curry and partial application in Ruby - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Curried Ruby Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of curried function with partial application
What is the output of this Ruby code using currying and partial application?
Ruby
def multiply(a, b, c)
  a * b * c
end

curried_multiply = method(:multiply).curry
partial = curried_multiply.call(2)
result = partial.call(3).call(4)
puts result
ANoMethodError
B14
C24
DTypeError
Attempts:
2 left
💡 Hint
Remember that currying transforms a method into a chain of functions each taking one argument.
Predict Output
intermediate
2:00remaining
Result of partial application with Proc
What will this Ruby code print when using partial application with a Proc?
Ruby
adder = ->(x, y, z) { x + y + z }
curried_adder = adder.curry
add_five = curried_adder.call(5)
result = add_five.call(10).call(15)
puts result
A30
B20
CArgumentError
DNoMethodError
Attempts:
2 left
💡 Hint
Currying a Proc works similarly to currying a method.
🔧 Debug
advanced
2:00remaining
Identify the error in currying usage
What error does this Ruby code raise when trying to curry a method incorrectly?
Ruby
def concat(a, b)
  a + b
end

curried = method(:concat).curry
result = curried.call('Hello').call
puts result
ASyntaxError
BNoMethodError: undefined method `call' for nil:NilClass
CTypeError: no implicit conversion of nil into String
DArgumentError: wrong number of arguments (given 0, expected 1)
Attempts:
2 left
💡 Hint
Check how many arguments the curried function expects at each call.
🧠 Conceptual
advanced
2:00remaining
Understanding partial application with default arguments
Given this Ruby method with default arguments, what is the output of the curried calls below?
Ruby
def greet(greeting, name = 'friend')
  "#{greeting}, #{name}!"
end

curried_greet = method(:greet).curry
say_hello = curried_greet.call('Hello')
puts say_hello.call
A"Hello, "
BArgumentError
C"Hello, friend!"
D"Hello, nil!"
Attempts:
2 left
💡 Hint
Currying does not automatically apply default arguments in Ruby methods.
🚀 Application
expert
3:00remaining
Create a curried function for filtering and transforming
You want to create a curried Ruby function that filters an array of numbers by a minimum value and then multiplies the filtered numbers by a factor. Which option correctly defines and uses this curried function to get [20, 30, 40, 60] from [5, 10, 15, 20, 30] with min 10 and factor 2?
A
filter_and_multiply = ->(min, factor, arr) { arr.select { |x| x >= min }.map { |x| x * factor } }.curry
result = filter_and_multiply.call(10).call(2).call([5,10,15,20,30])
puts result.inspect
B
filter_and_multiply = ->(arr, min, factor) { arr.select { |x| x >= min }.map { |x| x * factor } }.curry
result = filter_and_multiply.call([5,10,15,20,30]).call(10).call(2)
puts result.inspect
C
filter_and_multiply = ->(min, arr, factor) { arr.select { |x| x >= min }.map { |x| x * factor } }.curry
result = filter_and_multiply.call(10).call([5,10,15,20,30]).call(2)
puts result.inspect
D
filter_and_multiply = ->(min, factor, arr) { arr.map { |x| x * factor if x >= min } }.curry
result = filter_and_multiply.call(10).call(2).call([5,10,15,20,30])
puts result.inspect
Attempts:
2 left
💡 Hint
Remember the order of arguments matters for currying and that map with conditional returns nil for false conditions.