> > Haskell makes your functions pure by default. You have to change the type signature if you want to do IO
> The author seems to be conflating IO and side effects. IO is just one of the many ways that side effects can occur.
Indeed, but that does not refute the OP's statement.
> > Functions that do IO are difficult or impossible to test.
> Is your function creating a file? Start your test, assert the file doesn't exist, call your function, assert your file exists. Done.
Right, and (in my opinion) that is more difficult than testing something that doesn't create a file.
> > boo :: Map Integer String -> String -> Integer
> This syntax is clean but it doesn't tell me anything that
> def boo(map: Map[Integer, String], key: String) : Integer
> doesn't tell me.
Indeed, but again that does not refute the OP's statement which was simply that the syntax is clean.
> > The point is, you can't confidently reason about a function from its signature if IO is involved.
> Sure, you can: the mention of IO tells me this function operates within the IO monad, so I know a lot of operations and laws that apply to it.
You do? Please tell me a law that applies to IO.