Currying (👈 which you read about in yesterday's post) enables partial application, which lets us split up functions into small logical building blocks which are easier to both read and work with.
2 min read
By Vetle Bu Solgård
December 10, 2020
In programming languages where you don't have currying, you'll get a compiler error if you do not provide all the arguments to a function. As you've just learned yesterday, however, currying will instead return a new function if you provide a subset of its arguments. Such a function is known as a partially applied function.
Let's see a simple example.
We all want hard presents for christmas, lets write a function to check that a present is hard using currying. We will use the function
String.contains from the Elm core library. This is it's type signature👇
contains : String -> String -> Bool
It takes two
Strings, checking to see if the first
String´ is part of the secondString, then returning a
False. Here we can make use of partial application to see if a present is hard or soft by making a function that receives the description of a present.
isHardPresent : String -> Bool isHardPresent = String.contains "hard"
We partially apply the
String.contains function to write a function to check if a present is desirable or not. The second
String will be supplied to the
String.contains function where the
isHardPresent function is used.
isHardPresent “A sweather from grandma, soft” -- False isHardPresent “A playstation 5 game, hard” -- True
Simply supply the description of the present and the function will tell you if the present is worth buying. If we want to be a little more effective when christmas shopping, we can do this operation with lists of presents by using the function
filter : (a -> Bool) -> List a -> List a
The filter function takes a predicate and a list. It then only keeps elements that satisfy this predicate.
filterHardPresents : List String -> List String filterHardPresents = List.filter isHardPresent
We only supply the predicate argument to the
List.filter function here, and can now use this function on all our lists of presents. As you can see, partial application can be used in a number of useful ways! And just like that you have good present/bad present filter function ready to accompany you when christmas shopping🎅
filterHardPresents [ "Soft sweather from grandma", "Hard playstation game", "Hard fun toy", "Soft pillow", "Useless soft clothes" ] > [ "Hard playstation game", "Hard fun toy" ]