[Haskell-beginners] Equivalent of IO Monad in other functional languages?
Simon Kitching
simon at vonos.net
Mon Mar 16 14:45:20 UTC 2015
On 03/16/2015 03:04 PM, Heinrich Apfelmus wrote:
> Sumit Sahrawat, Maths & Computing, IIT (BHU) wrote:
>> On 15 March 2015 at 23:19, <amindfv at gmail.com> wrote:
>>
>>> From that perspective isn't every language pure? Haskell's still got
>>> "randomIO" and "print <=< readMVar"
>>
>> Haskell is impure only when you use the unsafe* functions (atleast
>> that's
>> how I understand purity).
>>
>> My understanding is that a language is impure if it allows one to write
>> arbitrary IO within a function and still give it a proper (mathematical)
>> function type. In other words impurity arises only if you can unwrap
>> the IO
>> monad (which is what the unsafe functions do).
>>
>> The two examples you give above are pure under such a perspective, but I
>> might be wrong.
>
> You're right, indeed. A language is pure if supplying a value `x` of
> type `A` to the a function
>
> A -> B
>
> will always returns the same result, no matter how often or in which
> order this function is called. This is true for both
>
> randomIO :: Random a => IO a
> (readMVar >=> print) :: Show a => MVar a -> IO ()
>
> because they return an IO action. This action will always be the same
> given the same arguments.
>
> The language would be impure if these functions had the types
>
> randomIO :: Random a => a
> (readMVar >=> print) :: Show a => MVar a -> ()
Doesn't "pure" correspond to "can write a unit test for"? When a
function's return value only ever depends on its inputs, then I can
write a set of test-cases for various inputs, and assert that the
return-value has the expected content.
A function that reads from a file, stdin, etc. cannot be tested in the
same way; I cannot _assert_ that the returned value has specific content.
Sumit stated earlier that IO is "a pure program that can be executed",
which seems similar to your description above (which I admit I
don't yet 100% understand). How can I "assert" anything about this
"program", or make a Haskell-based application 'safer' in any way by
leveraging this kind of 'purity'?
Thanks,
Simon
More information about the Beginners
mailing list