Почему "->" устарело в понимании F #? - PullRequest
7 голосов
/ 06 ноября 2010

Иногда в книгах я вижу такой синтаксис для понимания списка и последовательности в F #:

seq { for i = 0 to System.Int32.MaxValue -> i }

Это из Программирование F # Крисом Смитом , стр. 80. В F #, который приходитс VS2010 это не компилируется.Я считаю, -> устарела.(См. Альтернативный синтаксис понимания списка ).Тем не менее, -> все еще может использоваться в пониманиях, которые включают диапазоны:

seq { for c in 'A' .. 'Z' -> c }

Согласно Expert F # 2.0 , стр. 58, это потому, что -> является сокращением для Seq.map в пределах диапазона.

  1. Почему первое использование -> выше не рекомендуется?
  2. Текущее использование -> кажется несовместимым.Кто-нибудь может примирить это для меня?

1 Ответ

10 голосов
/ 06 ноября 2010

Конструкция -> поддерживается только в «простом» синтаксисе выражения последовательности, где вы выполняете проекцию (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 просто ->), но в более сложных случаях вы не сохраняете столько символов, и я думаю, что синтаксис, использующий -> & ->>, может выглядеть немного загадочным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...