Какую из этих двух альтернатив вы используете чаще всего, а какая более «идиоматична»?





Я использую () гораздо чаще, но это просто предпочтение, я почти уверен, что <| это более идиоматично, но я использую () по привычке.
Рейн, я недавно начал разбираться в F#. Вы используете его для коммерческой разработки или просто для развлечения? Меня очень интересуют реальные приложения на F#
Прямо сейчас просто для удовольствия, но он очень хорошо подходит для реальных приложений, этот язык прекрасен. Его можно использовать почти так же, как C#, только более элегантный и читаемый код!
Рейн, согласен. Мне это и вправду нравится. Надеюсь, они скоро получат RTM-версию.
Я использую его для автоматизации тестов производительности и написания утилит и скриптов на работе. Надеюсь, он наберет обороты.
По возможности я предпочитаю |>, потому что он читается слева направо.
В целом, я не знаю, что одно из них более идиоматично.
Лично я единственный раз использую <| с "поднять":
raise <| new FooException("blah")
Кроме того, я всегда использую скобки. Обратите внимание, что, поскольку большая часть кода F# использует каррированные функции, это обычно не подразумевает каких-либо «лишних» скобок:
f arg (g x y)
Когда вы попадаете в не каррированные функции и конструкторы и тому подобное, все становится менее привлекательно:
f arg (g(x,y))
Мы, вероятно, по крайней мере рассматривать изменим правила языков F#, чтобы приложения с высоким приоритетом связывались еще более жестко; прямо сейчас
f g()
разбирает как
f g ()
но многие люди хотели бы, чтобы он разбирался как
f (g())
(мотивирующий случай в исходном вопросе). Если у вас есть твердое мнение по этому поводу, оставьте комментарий к этому ответу.
Прочитав эту и следующие темы на FSHub cs.hubfs.net/forums/thread/3665.aspxcs.hubfs.net/forums/thread/5421.aspx, я подписываю петицию "make f g () parse like f (g ())", как только найду ручку! «Исправление» сделало бы использование фреймворка намного приятнее.
Я также хотел бы увидеть синтаксический анализ f g () как f (g ()), чтобы использование вызовов методов из фреймворка было более естественным. Но я беспокоюсь, что сейчас уже слишком поздно, учитывая, что у нас уже есть производственный релиз ...
На самом деле это еще можно изменить; язык различает «приложение» (g x) и «приложение с высоким приоритетом» (g(x) без пробелов между g и open-paren), поэтому f g(x) никогда не компилируется сегодня, независимо от того, принимает ли f 1 или 2 каррированных аргумента (f g (x) передает 2 аргумента в f, а f (g(x)) передает один аргумент в f). Таким образом, возможно, что будущая редакция языка «допустит больше легальных программ» в качестве неразрывного изменения. Но это было бы очень тонко (делая пробелы значимыми для дифференциальных юридических программ), и поэтому маловероятно.
Поскольку вывод типа работает слева направо, преимуществом использования |> является то, что он позволяет F# определять тип аргумента функции.
В качестве надуманного примера
[1; 2; 3] |> (fun x -> x.Length*2)
работает нормально, но
(fun x -> x.Length*2) [1; 2; 3]
жалуется на "поиск по объекту неопределенного типа".
+1 потому что я даже не знал
<|;)