1) Я бы не сказал, что монады избегают ... Вы упомянули, что у вас есть некоторый опыт работы с Haskell - поэтому рабочие процессы F # - это то, что вы хотите рассмотреть (термин рабочий процесс может сбивать с толку, но это только чуть-чуть, чтобы сделать с бизнес-процессами). В общем, выражения последовательности и, в более общем случае, вычислительные выражения (рабочие процессы a.k.a) будут близки к монадам. При этом изменчивость встречается довольно часто, хотя я не уверен, что «предпочтение» - это способ выразить это. У каждого из них есть место - Лично я начал с двух книг - «Основы F #», - но если вы хотите погрузиться в это, - «Эксперт F #» - обе хороши. Честно говоря, мне нужны были Фонды, чтобы помочь мне начать.
2) По моему опыту, путаница заключается в том, что традиционные функции в .NET имеют соглашение, которое действительно не поддается функциональному программированию. Таким образом, я чувствую, что в F # у вас может возникнуть путаница, когда вы смотрите на использование «традиционных .NET» именованных функций и элементов F #, которые явно функциональны ... Например, в книге, которую я упоминал выше «Эксперт F #» - они упоминают, что вы увидите значения let, такие как List.map и Dates.Today в camelCase и PascalCase (Pascal - более традиционный .NET). Хорошее практическое правило заключается в том, что если вы остаетесь в функциональном мире - используйте более традиционные функциональные (camelCase) именования - однако, если то, что вы делаете, предполагается использовать в других языках .NET, используйте больше .NET норма (Паскаль). Также обратите внимание, что в функциональном мире существует гораздо более высокий допуск к аббревиатурам (itr, tbl и т. Д.), Когда .NET в целом отошел от этого ... Итак, еще раз, вы увидите различную степень этого в некотором роде, если вы называете функциональные элементы против элементов, представленных в F #, которые являются общими для всего .NET.
3) Я согласен, что сочетание ОО и стилей функций может сбивать с толку. Опять же, я не уверен, что предпочтительнее, за исключением того, что F # (будучи функциональным) явно стилизует себя с точки зрения функциональной парадигмы. Однако F # - это функциональный язык в мире .NET (обратите внимание на относительную путаницу имен, о которой я упоминал выше) ... Итак, опять же, это не совсем ясно.
Надеюсь, это поможет ... Верьте или нет, если вы используете F # и думаете о других языках, которые имеют общие концепции C ++ с C (например) - это становится проще. Лично, присвоение имен стало иметь смысл, и концепции сработали, когда я начал понимать, что я являюсь F # - это функциональный язык, работающий на традиционной платформе, созданный для взаимодействия (хотя я не уверен, что было бы целесообразно называть взаимодействие бесшовным: D)