Следующее на самом деле относится не к коду, который вы разместили, а к вопросу, который вы, кажется, задали. Вместо этого он обращается к следующему коду:
do download i inputFile
onException
(callProcess (List.head args) (List.tail args))
(removeFileIfExists name)
░`finally` removeFileIfExists inputFile
ответ chi относится к фактически опубликованному коду, где `finally`
не имеет отступа дальше download
и onException
. Я бы заметил, что это плохой стиль: при написании этого обязательно делайте отступ меньше, т.е.
do download i inputFile
onException
(callProcess (List.head args) (List.tail args))
(removeFileIfExists name)
`finally` removeFileIfExists inputFile
Как заметил Виллем Ван Онсем, функциональные приложения всегда имеют приоритет перед инфиксными приложениями. Это верно как для истинных инфиксных операторов, таких как +
или >>=
, так и для обратных инфиксов... если на самом деле между этими типами операций нет четкого различия в том, что касается приоритета: для всех инфиксов приоритет определяется объявление фиксации, например
infixl 6 +
infix 4 `elem`
Фиксация — это число в диапазоне от 0 до 9, а фиксированность может быть либо лево-право-, либо неассоциативной. Если фиксированность не объявлена (как для большинства именованных функций, в то время как для символов-инфиксов настоятельно рекомендуется указать фиксированность), используется значение по умолчанию infixl 9
, т. е., по сути, максимально допустимая фиксированность, которую вы можете назначить вручную.
OTOH, приложение функции всегда infixl 10
как бы то ни было, т. е. связывает прочнее, чем любой инфикс, независимо от того, как он объявлен. Итак, ваш пример анализируется как
do (download i inputFile)
( (onException
(callProcess (List.head args) (List.tail args))
(removeFileIfExists name))
`finally`
(removeFileIfExists inputFile) )
person
leftaroundabout
schedule
26.02.2018
finally (onException (callProcess ...) (removeFileIfExists name)) (removeFileIfExists inputFile)
. Таким образом,finally
является основной функцией. - person Willem Van Onsem   schedule 26.02.2018