[Haskell-beginners] 'Simple' function

Yannis Juglaret yjuglaret at gmail.com
Wed Jun 10 18:22:20 UTC 2015


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Assuming

  asString :: IO String -> String

we have

  getLine :: IO String

  asString getLine :: String

Yet

  asString getLine

could be "Hello" the first time you use it, then "Hi" the second time
you use it. Same argument, different result, so this is not a pure
function.

- -- Yannis

On 10/06/2015 19:50, Mike Houghton wrote:
> Thanks for all the replies! It’s become a little clearer. However… 
> (again this is naive begginer stuff.. ) if the signature is
> 
> asString :: IO String -> String
> 
> why is this not a pure function? The IO string has already been
> supplied - maybe via keyboard input - and so for the same IO String
> the function will always return the  same value. Surely this
> behaviour is different to a monadic function that reads the
> keyboard and its  output (rather than the input) could be
> different. ie if I give asString an input of   IO “myString” then
> it will always return “myString” every time I invoke it with IO
> “myString”
> 
> Many thanks
> 
> Mike
> 
> 
> 
> 
>> On 10 Jun 2015, at 18:20, Imants Cekusins <imantc at gmail.com>
>> wrote:
>> 
>> Mike, if you are trying to run a "hello world" program in ghci,
>> here are 2 working functions.
>> 
>> -- #1 : all it does is prompts for input and sends the value back
>> to IO
>> 
>> module Text where
>> 
>> ioStr :: IO() ioStr = do putStrLn "enter anything" str <-
>> getLine putStrLn str
>> 
>> 
>> -- #2 this program prepends the string you pass to it as an arg
>> with "Hello"
>> 
>> str2str:: String -> String str2str s = "Hello " ++ s
>> 
>> 
>> -- how to run: -- #1 : ioStr -- #2 : str2str "some text"
>> 
>> hope this helps
>> 
>> 
>> On 10 June 2015 at 19:08, aldiyen <aldiyen at aldiyen.com> wrote:
>>> And just as a note, you can't really ever get the value inside
>>> the IO monad out. IO is not pure / non-deterministic, since it
>>> depends on something outside the program, and there's no way to
>>> "make it pure", as it were. You have to do all your operations
>>> on that String within the context of an IO
>>> 
>>> -aldiyen
>>> 
>>> 
>>> 
>>>> On Jun 10, 2015, at 12:47, Steven Williams
>>>> <theblessedadventhope at gmail.com> wrote:
>>>> 
> Here is return's type signature:
> 
> return :: Monad m => a -> m a
> 
> What you are doing with the do notation can also be expressed as
> ioStr
>>>>>>> = (\str -> return str).
> 
> do notation and bind both require you to have a value that has the 
> same monad as before.
> 
> Steven Williams My PGP Key:
> http://pgp.mit.edu/pks/lookup?op=get&search=0xCACA6C74669A54 FA
> 
>>>>>> On 10/06/15 12:35, Mike Houghton wrote: Hi,
>>>>>> 
>>>>>> I’ve been tryimg to write a function  with signature
>>>>>> 
>>>>>> asString :: IO String -> String
>>>>>> 
>>>>>> 
>>>>>> Does someone please have the patience to explain to me
>>>>>> what the compiler error messages really mean for these
>>>>>> two attempts and exactly what I’m doing (!!!) If I *do
>>>>>> not* give this function any type signature then it works
>>>>>> i.e..
>>>>>> 
>>>>>> asString ioStr = do str <- ioStr return $ str
>>>>>> 
>>>>>> and the compiler tells me its signature is
>>>>>> 
>>>>>> asString :: forall (m :: * -> *) b. Monad m => m b -> m
>>>>>> b
>>>>>> 
>>>>>> which, at this stage of my Haskell progress, is just pure
>>>>>> Voodoo. Why isn’t it’s signature  asString :: IO String
>>>>>> -> String ?
>>>>>> 
>>>>>> 
>>>>>> Another naive attempt is asString ioStr = str where str
>>>>>> <- ioStr
>>>>>> 
>>>>>> and then compiler says parse error on input ‘<-’
>>>>>> 
>>>>>> 
>>>>>> Many Thanks
>>>>>> 
>>>>>> Mike
>>>>>> 
>>>>>> _______________________________________________ Beginners
>>>>>> mailing list Beginners at haskell.org 
>>>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>>
>>>>>> 
_______________________________________________
>>>> Beginners mailing list Beginners at haskell.org 
>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>> _______________________________________________ Beginners
>>> mailing list Beginners at haskell.org 
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>> _______________________________________________ Beginners mailing
>> list Beginners at haskell.org 
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> 
> _______________________________________________ Beginners mailing
> list Beginners at haskell.org 
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> 

- -- 
Yannis JUGLARET


More information about the Beginners mailing list