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 String
s, checking to see if the first String´ is part of the second
String, then returning a Bool
of True
or 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 List.filter
.
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" ]