Я нашел несколько писем, в которых мы исправили реализацию, чтобы иметь жесткий порядок приложений. Код
open System
let f a =
Console.WriteLine "app1";
fun b ->
Console.WriteLine "app2";
()
(Console.WriteLine "f"; f) (Console.WriteLine "arg1") (Console.WriteLine "arg2")
выведет «f», «arg1», «arg2», «app1», «app2». Однако это не вошло в спецификацию. Я отправлю сообщение об ошибке спецификации.
(Некоторые другие части спецификации уже более явные, например,
6.9.6 Оценка применения метода
Для сложных применений методов, разработанная форма выражения будет либо expr.M (args), либо M (args).
(Необязательно) expr и args оцениваются в порядке слева направо, а тело члена оценивается в среде с формальными параметрами, которые сопоставляются с соответствующими значениями аргумента.
Если значение expr равно нулю, возникает исключение NullReferenceException.
Если метод представляет собой виртуальный интервал отправки (то есть метод, который объявлен абстрактным), то тело элемента выбирается в соответствии с картами отправки значения expr.
Тем не менее, некоторые эксперты считают, что вы будете жить более долгой и счастливой жизнью, если не будете полагаться на порядок оценки. :))
(Возможно см. Также
http://blogs.msdn.com/ericlippert/archive/2009/11/19/always-write-a-spec-part-one.aspx
http://blogs.msdn.com/ericlippert/archive/2009/11/23/always-write-a-spec-part-two.aspx
, чтобы узнать, как легко все испортить с помощью порядка оценки.)