Below code :
Prelude> :t putStrLn
putStrLn :: String -> IO ()
Prelude> putStrLn "test"
test
it :: ()
Prelude> putStrLn "test" ++ "test"
<interactive>:25:1:
    Couldn't match expected type ‘[Char]’ with actual type ‘IO ()’
    In the first argument of ‘(++)’, namely ‘putStrLn "test"’
    In the expression: putStrLn "test" ++ "test"
Prelude> :t "test"
"test" :: [Char]
Prelude> :t "test" ++ "test" 
"test" ++ "test" :: [Char]
Prelude> 
I do not understand error :
" Couldn't match expected type ‘[Char]’ with actual type ‘IO ()’
        In the first argument of ‘(++)’, namely ‘putStrLn "test"’
        In the expression: putStrLn "test" ++ "test""
As putStrLn accepts a [Char] type as first parameter (I assume its implicitly converted to String ?). But this does not type check if "test" ++ "test" is passed as parameter, even though "test" ++ "test" is of type [Char] also ?
Your code doesn't pass "test" ++ "test" as a parameter. Function application binds tighter than any infix operator. Your code is parsed as
(putStrLn "test") ++ "test"
The error you get refers to the fact that putStrLn does not return a string.
To solve this, write
putStrLn ("test" ++ "test")
Note: String is defined as type String = [Char], i.e. it's just a different name for the same type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With