user1798403
user1798403

Reputation: 43

Haskell: [String] to IO ()

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

Answers (3)

Benjamin Hodgson
Benjamin Hodgson

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

Lee
Lee

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

Whadupapp
Whadupapp

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

Related Questions