Конструкция ->
поддерживается только в «простом» синтаксисе выражения последовательности, где вы выполняете проекцию (Seq.map
) на некоторый источник данных, используя следующую структуру:
seq { for <binding> in <input> -> <projection> }
В первом примере, который вы упомянули, используется for .. to ..
, синтаксическая конструкция которого отличается от for .. in
, но вы можете переписать его, используя второй (фактически, я почти всегда использую for .. in
при написании выражений последовательности):
seq { for i in 0 .. System.Int32.MaxValue -> i }
Во всех других формах выражений последовательности вам придется использовать yield
. В более ранних версиях F # синтаксис ->
был эквивалентен yield
(а также был ->>
, который был эквивалентен yield!
). Так, например, вы смогли написать:
seq { -> 10 // You need 'yield' here
->> [ 1; 2; 3 ] } // You need 'yield!' here
Этот синтаксис выглядит довольно странно, поэтому я думаю, что главная причина, по которой эти два не рекомендуется использовать, заключается в поддержании согласованности языка. Тот же синтаксис выражения вычисления используется в выражениях последовательности (где ->
имеет смысл), но также и для других типов вычислений (и вы можете определить свой собственный), где yield
кажется более подходящим (и это также соответствует return
в асинхронных рабочих процессах или других вычислительных выражениях).
«Простой» специфичный для последовательности синтаксис все еще полезен, потому что он экономит некоторую печать (вы заменяете do yield
просто ->
), но в более сложных случаях вы не сохраняете столько символов, и я думаю, что синтаксис, использующий ->
& ->>
, может выглядеть немного загадочным.