Reputation: 43
I am new to Haskell and I am trying to get a list of values from input and print one item out from the list each line.
func :: [String] -> IO ()
I am having trouble trying to figure out how to print out the item in the list, when the list size is just 1.
func [] = return ()
func [x] = return x
I am getting this error message when trying to compile the file:
Couldn't match expected type `()' with actual type `String'
In the first argument of `return', namely `x'
In the expression: return x
I am completely lost and I have tried searching but haven't found anything. Thanks!
Upvotes: 2
Views: 1786
Reputation: 44634
func = mapM_ putStrLn
mapM_
applies a monadic function like putStrLn
to each element of a list, and discards the return value.
Upvotes: 8
Reputation: 144136
You can use forM_
for this:
func :: [String] -> IO ()
func l = forM_ l putStrLn
If you want to write your own version directly, you have some problems.
For the empty list, you have nothing to do but create a value of IO ()
, which you can do with return.
For the non-empty list you want to output the line with putStrLn
and then process the rest of the list. The non-empty list is of the form x:xs
where x
is the head of the list and xs
the tail. Your second pattern matches the one-element list.
func [] = return ()
func (x:xs) = putStrLn x >> func xs
Upvotes: 9
Reputation: 170
you actually aren't trying to print anything, you use putStr for that. try something like
print [] = return ()
print (x:xs) = do
putStr x
print xs
Upvotes: 7