Haskell, how to print value and return in function
haskell, iteration
Solution
Your first problem is that you have the wrong syntax for an `if` statement. You should write
firstItem n = if {- condition-}
then {- do this -}
else {- do that -}
Second, it's not clear what the function `firstItem` is supposed to do. It sounds like it's supposed to return the first item of a list, but your description makes it seem as though you want to iterate over all elements of the list.
You can combine the iteration and printing into a single function like this:
printAll xs = if null xs -- If the list is empty
then return () -- then we're done, so we quit.
else do print (head xs) -- Otherwise, print the first element
printAll (tail xs) -- then print all the other elements.
main = printAll [1,2,3]
The function `null` returns `True` if the list is empty, otherwise it returns `False`. The statement `return ()` you can think of as saying "there's nothing more to process, so stop the function now and return no result". The third and fourth lines contain a "do block". The do block is basically a bit of glue that binds the two actions `print (head xs)` and `printAll (tail xs)` together into one action. You can write it with curly braces to make it a bit clearer:
do {
print (head xs);
printAll (tail xs)
}
although you don't actually need them - the indentation specifies what you mean.
This solves your problem, but it's a bit clunky. Haskell is supposed to be a beautiful language, after all - so let's make your code beautiful! It would be better to use pattern matching to pull the list apart into its head and tail:
printAll [] = return ()
printAll (x:xs) = do print x
printAll xs
That's a lot better. But it could be more modular. Hey, maybe we could make a generic function that takes an action as input, and does that action for every element of the list:
repeatedly f [] = return ()
repeatedly f (x:xs) = do f x
repeatedly f xs
printAll xs = repeatedly print xs
That's neat. But actually, there's already a function that does this. It's called `mapM_` (there is a good reason for it being called this, but I won't get into it now) and it's in the `Control.Monad` module:
import Control.Monad
printAll xs = mapM_ print xs
Actually, you can leave off the `xs` argument, and the compiler can infer that it's supposed to be there:
printAll = mapM_ print
Finally, your code is beautiful. Hope that helps a bit.
Problem
I try to write custom function which take an array and iterate it, i need to print every digit and recursive launch the same function but i get error parse error on input `main' code: ``` firstitem n = if n /= [] n firstitem( tail n ) main = do print(firstitem [1,2,3]) ```