Skip to content

Instantly share code, notes, and snippets.

@rdavison
Last active July 11, 2017 14:37
Show Gist options
  • Save rdavison/02e4115ad23430fdf330346ffa282656 to your computer and use it in GitHub Desktop.
Save rdavison/02e4115ad23430fdf330346ffa282656 to your computer and use it in GitHub Desktop.
Applying a function to lists using applicative functors
import Control.Applicative
-- Create a Person data type
data Person = Person {
name :: String,
age :: Int,
language :: String
} deriving (Show)
-- Person is a data constructor, and has a function signature of
-- Person :: String -> Int -> String -> Person
-- On line 22, it is being put into an applicative context
-- `pure` is a function which puts a function into an Applicative context.
-- In this case, it being put inside the List context.
-- Then, the <*> function applies the function to each argument
-- in each list
cartesianProductOfPeople =
let names = ["Alice", "Bob", "Carlos"] in
let ages = [18, 25, 40] in
let languages = ["English", "Spanish", "Portuguese"] in
let applicativeMakePerson = pure Person in
applicativeMakePerson <*> names <*> ages <*> languages
-- Print the cartesian product of people that we built in the previous function
main = mapM_ (putStrLn . show) cartesianProductOfPeople
-- Prints the following output
-- Person {name = "Alice", age = 18, language = "English"}
-- Person {name = "Alice", age = 18, language = "Spanish"}
-- Person {name = "Alice", age = 18, language = "Portuguese"}
-- Person {name = "Alice", age = 25, language = "English"}
-- Person {name = "Alice", age = 25, language = "Spanish"}
-- Person {name = "Alice", age = 25, language = "Portuguese"}
-- Person {name = "Alice", age = 40, language = "English"}
-- Person {name = "Alice", age = 40, language = "Spanish"}
-- Person {name = "Alice", age = 40, language = "Portuguese"}
-- Person {name = "Bob", age = 18, language = "English"}
-- Person {name = "Bob", age = 18, language = "Spanish"}
-- Person {name = "Bob", age = 18, language = "Portuguese"}
-- Person {name = "Bob", age = 25, language = "English"}
-- Person {name = "Bob", age = 25, language = "Spanish"}
-- Person {name = "Bob", age = 25, language = "Portuguese"}
-- Person {name = "Bob", age = 40, language = "English"}
-- Person {name = "Bob", age = 40, language = "Spanish"}
-- Person {name = "Bob", age = 40, language = "Portuguese"}
-- Person {name = "Carlos", age = 18, language = "English"}
-- Person {name = "Carlos", age = 18, language = "Spanish"}
-- Person {name = "Carlos", age = 18, language = "Portuguese"}
-- Person {name = "Carlos", age = 25, language = "English"}
-- Person {name = "Carlos", age = 25, language = "Spanish"}
-- Person {name = "Carlos", age = 25, language = "Portuguese"}
-- Person {name = "Carlos", age = 40, language = "English"}
-- Person {name = "Carlos", age = 40, language = "Spanish"}
-- Person {name = "Carlos", age = 40, language = "Portuguese"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment