📖 Scenario: Imagine you run a small bakery. You want to create a simple way to calculate the price of different baked goods with tax included. Instead of writing the tax calculation every time, you will use a technique called currying to make your code cleaner and easier to reuse.
🎯 Goal: Build a Ruby program that uses currying to create a function for calculating the price of baked goods including tax. You will start by creating a basic price calculator, then use currying to fix the tax rate, and finally calculate prices for different items.
📋 What You'll Learn
Create a method called calculate_price that takes two arguments: tax_rate and price.
Create a curried version of calculate_price called curried_calculate_price.
Use partial application to fix the tax rate at 0.08 (8%) and create a new function called price_with_tax.
Calculate the price with tax for an item costing 100 using price_with_tax.
Print the final price with tax.
💡 Why This Matters
🌍 Real World
Currying and partial application help programmers write cleaner and reusable code, especially when some inputs stay the same across many calculations, like tax rates in pricing.
💼 Career
Understanding currying is useful in functional programming and can improve your ability to write modular, maintainable code in Ruby and other languages.
Progress0 / 4 steps
1
Create the basic price calculator method
Write a method called calculate_price that takes two parameters: tax_rate and price. It should return the total price including tax by calculating price + price * tax_rate.
Ruby
Hint
Remember, a method in Ruby starts with def and ends with end. Use price + price * tax_rate to calculate the total.
2
Create a curried version of the method
Create a variable called curried_calculate_price that stores the curried version of the calculate_price method. Use the method(:calculate_price).to_proc.curry syntax.
Ruby
Hint
Use method(:calculate_price).to_proc.curry to get the curried version of the method.
3
Fix the tax rate using partial application
Create a new variable called price_with_tax by calling curried_calculate_price with the tax rate fixed at 0.08 (8%).
Ruby
Hint
Call curried_calculate_price with 0.08 to fix the tax rate.
4
Calculate and print the final price with tax
Use the price_with_tax function to calculate the price including tax for an item costing 100. Store the result in a variable called final_price. Then print final_price.
Ruby
Hint
Call price_with_tax.call(100) to get the final price, then print it with puts.
Practice
(1/5)
1. What does currying a function in Ruby allow you to do?
easy
A. Call the function with fewer arguments and get a new function
B. Run the function faster by optimizing code
C. Convert the function into a class method
D. Automatically memoize the function results
Solution
Step 1: Understand currying concept
Currying transforms a function so you can call it with fewer arguments than it needs.
Step 2: Result of currying
When called with fewer arguments, it returns a new function waiting for the rest.
Final Answer:
Call the function with fewer arguments and get a new function -> Option A
Quick Check:
Currying = call fewer args, get new function [OK]
Hint: Currying means breaking function calls into smaller steps [OK]
Common Mistakes:
Thinking currying speeds up code
Confusing currying with memoization
Believing currying changes function to class method
2. Which of the following is the correct way to curry a lambda in Ruby?
easy
A. lambda.curry(my_lambda)
B. curry(my_lambda)
C. my_lambda.partial
D. my_lambda.curry
Solution
Step 1: Recall Ruby syntax for currying
In Ruby, you call the .curry method on a lambda or Proc object.
Step 2: Identify correct usage
Calling my_lambda.curry returns a curried version of the lambda.
Final Answer:
my_lambda.curry -> Option D
Quick Check:
Use .curry method on lambda object [OK]
Hint: Use .curry directly on lambda or Proc [OK]
Common Mistakes:
Trying to call curry as a standalone function
Using .partial instead of .curry
Passing lambda as argument to curry method
3. What is the output of this Ruby code?
add = ->(x, y) { x + y }
curried_add = add.curry
add_five = curried_add.call(5)
puts add_five.call(3)
medium
A. 5
B. 3
C. 8
D. Error
Solution
Step 1: Understand currying and calls
The lambda add takes two arguments and returns their sum. Currying allows calling with one argument to get a new function.
Step 2: Trace the calls
curried_add.call(5) returns a new function that adds 5 to its argument. Calling add_five.call(3) returns 5 + 3 = 8.
Final Answer:
8 -> Option C
Quick Check:
Curried add with 5 then 3 = 8 [OK]
Hint: Currying splits args; add 5 + 3 = 8 [OK]
Common Mistakes:
Expecting add_five to be a number, not a function
Confusing call with direct invocation
Thinking currying changes output type
4. Identify the error in this Ruby code using currying:
multiply = ->(x, y) { x * y }
curried_multiply = multiply.curry
result = curried_multiply(2)(3)
puts result
medium
A. multiply should be defined with def, not lambda
B. No error, code runs correctly and prints 6
C. curry method does not exist for lambdas
D. curried_multiply(2)(3) should be curried_multiply.call(2).call(3)
Solution
Step 1: Check syntax for currying and calling
In Ruby, lambdas can be curried and called using parentheses like functions.
Step 2: Verify code behavior
curried_multiply(2) returns a function that multiplies by 2; calling (3) returns 6. The code runs without error.
Final Answer:
No error, code runs correctly and prints 6 -> Option B
Quick Check:
Currying with lambdas and calls works as shown [OK]
Hint: Parentheses work for calling curried lambdas [OK]