Каков порядок оценки в F #? - PullRequest
4 голосов
/ 22 января 2011

Я читал это и теперь задаюсь вопросом: каков порядок оценки в F #?

Очевидно, ; заставляет эффекты появляться последовательно. Но что насчет таких вещей, как вызовы функций или приложений, порядок вычисления для операторов и т. П.

Я посмотрел на спецификацию F #, но об этом ничего не сказано. Спасибо за понимание!

1 Ответ

8 голосов
/ 22 января 2011

Я нашел несколько писем, в которых мы исправили реализацию, чтобы иметь жесткий порядок приложений. Код

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

, чтобы узнать, как легко все испортить с помощью порядка оценки.)

...