John Wicket wrote:

On 9/24/07, Sam Hughes <[EMAIL PROTECTED]> wrote:
John Wicket wrote:
I am still in an imperative way of thinking.  In this example here; how
would I call "putStrLn" and then set the function with a value.  Eg:

aa :: String -> IO ()
aa instr = do
  putStrLn "abc"
  putStrLn "abc"
  return "123"

--- The error I am getting.

    Couldn't match expected type `()' against inferred type `[Char]'
    In the first argument of `return', namely `"123"'
    In the expression: return "123"
    In the expression:
    do putStrLn "abc"
       putStrLn "abc"
       return "123"
Your type signature is wrong.  If you want an IO action whose return
value is a String, say so:

aa :: String -> IO String


> Sorry, I was actually trying to use this as an example for something more
> complicated I am trying to do. In this example, why would the inferred type
> be "IO ()"
>
> aa :: String -> String
> aa instr = do
>   putStrLn "abc"
>   putStrLn "abc"
>   return "Az"
>
>   Couldn't match expected type `[t]' against inferred type `IO ()'
>     In the expression: putStrLn "abc"
>     In a 'do' expression: putStrLn "abc"
>     In the expression:
>     do putStrLn "abc"
>        putStrLn "abc"
>        return "Az"
>

Ah. Because the value, putStrLn "abc", is a value of type IO (). Your problem is that you're trying to do an input/output action in a pure function. You'll need a function that returns a value of type 'IO String' (or 'IO somethingElse'). Then the do notation is used to construct actions, by chaining small actions together. Here your compiler thinks it's trying to construct a list, because do notation can be used for any monad...

Note that 'return' isn't a keyword that returns from a function, it's a function that returns a value. For example, in the code

foo :: IO Int
foo = do print 3
     return 5

return 5 is of type IO Int. That is, it's an action that 'returns' a value of type Int (when executed), so to speak. ('print 3' is an action that 'returns' a value of type (), by the way.)

When you say you have

aa :: String -> String,

you're advertising that (aa foo) is a String. You're not advertising that it's an action that returns a String, because they're different things. do notation isn't for doing things and returning a value, it's for combining actions together into one bigger action. If you want to do things, you need your function to construct an action that does things, which means you want

aa :: String -> IO String

But the function 'aa' doesn't "do" things, it constructs an action.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to