Actually, you should not indicate the code that you sent, but the question that you seemed to ask . Instead, it refers to the following code:
do download i inputFile onException (callProcess (List.head args) (List.tail args)) (removeFileIfExists name) โ`finally` removeFileIfExists inputFile
chi answer addresses the actually published code, `finally` has no indentation except download and onException . I would notice that this is a bad style: when you write this, be sure to release it less, i.e.
do download i inputFile onException (callProcess (List.head args) (List.tail args)) (removeFileIfExists name) `finally` removeFileIfExists inputFile
As Willem Van Onsem commented, functional applications always take precedence over infix applications. This is true both for "real infix operators", such as + or >>= , and for reverse drifts ... if there is no fact that there is no difference between these types of operators with respect to priority: for all infix, priority is determined by a commit declaration, eg
infixl 6 + infix 4 `elem`
A commit is a number in the range of 0..9, and a commit can be either left, right, or non-associative. If a non-commit is declared (as is the case for most named functions, while for infix characters it is strongly recommended to declare a commit), the default value is infixl 9 , i.e. basically the highest legal commit you could manually assign.
OTOH, application application always infixl 10 as it were, i.e. it binds a tiger than any infix, no matter how it is declared. So your example is parsed as
do (download i inputFile) ( (onException (callProcess (List.head args) (List.tail args)) (removeFileIfExists name)) `finally` (removeFileIfExists inputFile) )