I’m learning functional programming and writing things down as I go. Some of my understanding may be incomplete or wrong, and I expect to refine it in the fullness of time.
Today I was working on CIS194 Homework 1.
I learned how to provide a modicum of interactivity - the following code reads lines in from the keyboard and then outputs text based on the input:
-- Validate the given string validate :: String -> String validate str = if isValid str then "Valid" else "Not valid" -- Use lines to break up input on \n -- Use unlines to join multiple lines of output (and separate them by \n) validateInput :: String -> String validateInput input = unlines (map validate (lines input)) main :: IO () main = do putStrLn "Hello!" -- interact takes a String -> String function and -- provides an input/output loop based on it interact validateInput
I believe this relies on lazy evaluation to provide an interactive input/output loop (i.e. I can enter a line and immediately see the result, then enter another one etc.).
Partial application is useful for writing readable code:
double = map (\x -> 2 * x)
double function doubles the elements of a list. Here, I’ve only passed the first argument to
map so it’s partially applied, which makes
double a function of one argument (a list).
I’ve also used a lambda as the argument to map.
As a concluding remark, writing stateless functions is still difficult for now.
That’s it for today!