You can't just put `putStrLn "Hello"` in the top level of a Haskell program and expect it to work. You can do it in a REPL, but that's besides the point.
And my point is that Haskell doesn't even look like it's run from top to bottom.
Example, consider this mutually recursive definition at the top level:
a = 1:b
b = 2:a
It doesn't, by any means logical or not, look like it runs from top to bottom. If so, the first line would have immediately been an error because `b` is an undefined name.
“To me, if something acts logically like it is run from top to bottom, it's a scripting language.”
I don’t see them as scripting languages, but that definition would include them.