mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2025-05-06 23:08:34 +00:00
Updated haskell.html.markdown with a better IO() tutorial
I have added a more detailed tutorial on IO(). I feel that what was there before would only make a newcomer confused. When I was learning this, the crucial insight was to understand how to interpret the types of the IO functions, and I tried to elucidate this. There are also three minor, related changes: I changed the `say` function to be Color -> String. I found the older version Color -> IO String confusing, and it did not compile anyway. I also use the new `say` function. I added a note that the REPL can run IO actions. There was a minor error in the `action` function that I fixed.
This commit is contained in:
parent
171b01bb02
commit
90929bfc6d
@ -281,10 +281,11 @@ data Color = Red | Blue | Green
|
|||||||
|
|
||||||
-- Now you can use it in a function:
|
-- Now you can use it in a function:
|
||||||
|
|
||||||
say :: Color -> IO String
|
|
||||||
say Red = putStrLn "You are Red!"
|
say :: Color -> String
|
||||||
say Blue = putStrLn "You are Blue!"
|
say Red = "You are Red!"
|
||||||
say Green = putStrLn "You are Green!"
|
say Blue = "You are Blue!"
|
||||||
|
say Green = "You are Green!"
|
||||||
|
|
||||||
-- Your data types can have parameters too:
|
-- Your data types can have parameters too:
|
||||||
|
|
||||||
@ -306,7 +307,7 @@ Just 1
|
|||||||
-- called. It must return a value of type `IO ()`. For example:
|
-- called. It must return a value of type `IO ()`. For example:
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = putStrLn "Hello, sky! " ++ (say Blue)
|
main = putStrLn $ "Hello, sky! " ++ (say Blue)
|
||||||
-- putStrLn has type String -> IO ()
|
-- putStrLn has type String -> IO ()
|
||||||
|
|
||||||
-- It is easiest to do IO if you can implement your program as
|
-- It is easiest to do IO if you can implement your program as
|
||||||
@ -329,9 +330,10 @@ sayHello :: IO ()
|
|||||||
sayHello = do
|
sayHello = do
|
||||||
putStrLn "What is your name?"
|
putStrLn "What is your name?"
|
||||||
name <- getLine -- this gets a line and gives it the name "input"
|
name <- getLine -- this gets a line and gives it the name "input"
|
||||||
putStrLn "Hello, " ++ name
|
putStrLn $ "Hello, " ++ name
|
||||||
|
|
||||||
-- Exercise: write your own version of `interact`.
|
-- Exercise: write your own version of `interact` that only reads
|
||||||
|
-- one line of input.
|
||||||
|
|
||||||
-- The code in `sayHello` will never be executed, however. The only
|
-- The code in `sayHello` will never be executed, however. The only
|
||||||
-- action that ever gets executed is the value of `main`.
|
-- action that ever gets executed is the value of `main`.
|
||||||
@ -351,7 +353,7 @@ sayHello = do
|
|||||||
action :: IO String
|
action :: IO String
|
||||||
action = do
|
action = do
|
||||||
putStrLn "This is a line. Duh"
|
putStrLn "This is a line. Duh"
|
||||||
input <- getLine
|
input1 <- getLine
|
||||||
input2 <- getLine
|
input2 <- getLine
|
||||||
-- The type of the `do` statement is that of its last line.
|
-- The type of the `do` statement is that of its last line.
|
||||||
-- `return` is not a keyword, but merely a function
|
-- `return` is not a keyword, but merely a function
|
||||||
@ -389,6 +391,14 @@ let foo = 5
|
|||||||
|
|
||||||
>:t foo
|
>:t foo
|
||||||
foo :: Integer
|
foo :: Integer
|
||||||
|
|
||||||
|
-- You can also run any action of type `IO ()`
|
||||||
|
|
||||||
|
> sayHello
|
||||||
|
What is your name?
|
||||||
|
Friend!
|
||||||
|
Hello, Friend!
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
There's a lot more to Haskell, including typeclasses and monads. These are the big ideas that make Haskell such fun to code in. I'll leave you with one final Haskell example: an implementation of quicksort in Haskell:
|
There's a lot more to Haskell, including typeclasses and monads. These are the big ideas that make Haskell such fun to code in. I'll leave you with one final Haskell example: an implementation of quicksort in Haskell:
|
||||||
|
Loading…
Reference in New Issue
Block a user