Стиль F# — предпочитаете () или <|
-
02-07-2019 - |
Вопрос
Какой из этих двух альтернатив вы используете чаще всего и какой более «идиоматичен»?
- f аргумент (obj.DoStuff())
- f arg <| obj.dostuff ()
Решение
В целом, я не знаю, что то или иное более идиоматично.
Лично, единственный раз, когда я использую <| с "подъем":
raise <| new FooException("blah")
Кроме того, я всегда использую скобки.Обратите внимание: поскольку большая часть кода F# использует каррированные функции, это обычно не подразумевает каких-либо «лишних» скобок:
f arg (g x y)
Когда вы переходите к некаррированным функциям, конструкторам и тому подобному, все становится менее красиво:
f arg (g(x,y))
Мы, вероятно, по крайней мере учитывать изменение правил языков F#, чтобы приложения с высоким приоритетом привязывались еще более жестко;прямо сейчас
f g()
анализирует как
f g ()
но многие люди хотели бы, чтобы это анализировалось как
f (g())
(мотивирующий случай в исходном вопросе).Если у вас есть твердое мнение по этому поводу, оставьте комментарий к этому ответу.
Другие советы
Поскольку вывод типа работает слева направо, преимущество использования |>
заключается в том, что он позволяет F # определять тип аргумента функции.
В качестве надуманного примера,
[1; 2; 3] |> (fun x -> x.Length*2)
работает нормально, но
(fun x -> x.Length*2) [1; 2; 3]
жалуется на «поиск объекта неопределенного типа».
Я использую () гораздо чаще, но это просто предпочтение, я почти уверен, что <| более идентификатор, но я использую () по привычке.
По возможности я предпочитаю |>, потому что он читается слева направо.