Isaac Dupree wrote:
> Heinrich Apfelmus wrote:
>> However, in a sense, one can interpret the pure in purely functional as
>> a property of the type constructor (->) , i.e. a function of type (a ->
>> b) is guaranteed to not have side effects. In this light, ML and Scheme
>> are lacking a very important type: they only have functions with side
>> effects.
>>> Or more precisely, their type system does not distinguish
>> between functions with and without side effects.
>> that's not actually more precise! Haskell doesn't entirely do that
> either. consider:
> f :: Int -> IO Int
> f x = return (x + 1)
> No side effects! But other ->IO typed values do yield side-effects.
>> It is exactly as if ML and Scheme contain only the type of (->) composed
> with IO. (Well, actually Scheme is dynamically typed so it's a bit
> silly to say so..) (and Scheme allows functions with zero arguments,
> which are different from its non-side-effecting values.. not sure about ML)
Yes, "distinguish" in the sense of "optional distinction by annotation"
instead of "automatically detect whether a function has side effects or
not".
(By the way, in a sense it is possible to detect that f has no side
effects. Namely, it's most general type is polymorphic in the monad:
f :: Monad m => Int -> m Int
)
This is much like Java lacking (having lacked?) types whose values
cannot be null , compared to a vs Maybe a in Haskell.
Regards,
Heinrich Apfelmus
--
http://apfelmus.nfshost.com