REVISED: Monday, October 21, 2024
Haskell user input.
Imperative programming is monadic; and, monadic do blocks look like imperative code.
I. HASKELL USER INPUT
A. WRITE HASKELL PROGRAM
Haskell is a lazy language, the order in which operations are evaluated in it is unspecified. do allows us to specify the order of operations. Therefore, if we want to write a function that is interactive one way to do this is to use the do keyword. However, the last statement in a do block must be an expression. For example, as shown below the last statement is a putStrLn which starts an expression.
For example; "Copy Paste" the following Haskell program into your text editor:
where
main = do
putStrLn "Type your favorite food or type exit and press Enter."
food <- getLine
if food == "exit"
then do
return ()
else do
putStrLn ("Amazing! My favorite food is also " ++ food ++ "!")
main
From your text editor do a "File, Save As", and save the file as Food.hs to your working directory.
To get the value out of an I/O action, you have to perform it inside another I/O action by binding it to a name with <-, a function arrow pronounced: "drawn from".
Read "food <- getLine" as, "Perform the I/O action getLine and then bind its result value to food". The getLine function works with <- and binds input to a variable. getLine has a type of IO String, so food will have a type of String. In other words, food is "drawn from" getline.
In a do block, the last action cannot be bound to a name. The value from the last action is extracted and bound by the do block to the result.
B. LOAD HASKELL PROGRAM INTO GHCi INTERPRETER
After the GHCi Prelude> prompt type :load Food as shown below, then press Enter:
Prelude> :load Food
[1 of 1] Compiling Food ( Food.hs, interpreted )
Ok, modules loaded: Food.
C. CALL MAIN FUNCTION IN GHCi
Prelude> main
Type your favorite food or type exit and press Enter.
Steak -- Enter your favorite food at the prompt.
Amazing! My favorite food is also Steak!
Type your favorite food or type exit and press Enter.
exit
it :: () -- Appears because of options currently set: +t
Prelude>
Type your favorite food or type exit and press Enter.
Steak -- Enter your favorite food at the prompt.
Amazing! My favorite food is also Steak!
Type your favorite food or type exit and press Enter.
exit
it :: () -- Appears because of options currently set: +t
Prelude>
II. SUMMARY
Every line of a do structure must return some IO a.
The <- drawn from operator takes a function of type IO a and extracts the a value.
The last line of a do structure cannot use a <- drawn from operator.
Any function that calls an IO function must also be an IO function.
IO functions call pure functions.
Pure functions never ever call IO functions.
III. CONCLUSION
In this tutorial, you have received an introduction to Haskell user input.
IV. REFERENCES
Bird, R. (2015). Thinking Functionally with Haskell. Cambridge, England: Cambridge University Press.
Davie, A. (1992). Introduction to Functional Programming Systems Using Haskell. Cambridge, England: Cambridge University Press.
Goerzen, J. & O'Sullivan, B. & Stewart, D. (2008). Real World Haskell. Sebastopol, CA: O'Reilly Media, Inc.
Hutton, G. (2007). Programming in Haskell. New York: Cambridge University Press.
Lipovača, M. (2011). Learn You a Haskell for Great Good!: A Beginner's Guide. San Francisco, CA: No Starch Press, Inc.
Thompson, S. (2011). The Craft of Functional Programming. Edinburgh Gate, Harlow, England: Pearson Education Limited.