Если вы хотите, чтобы ваш API вызывался из F #, do верните void
, если вы не уверены, что этот конкретный вызов метода будет связан с другим почти каждый раз, когда он будет использоваться.
Если вы не хотите, чтобы ваш API был легок в использовании из F #, вы можете перестать читать здесь.
F # более строг, чем C #, в некоторых областях - он хочет, чтобы вы были явновызываете ли вы метод, чтобы получить значение, или просто для его побочных эффектов.В результате, вызов метода для его побочных эффектов, когда этот метод также возвращает значение, становится неудобным, потому что возвращаемое значение должно быть явно проигнорировано, чтобы избежать ошибок компилятора.Это делает «плавные интерфейсы» несколько неудобными для использования из F #, который имеет собственный превосходный синтаксис для объединения последовательности вызовов.
Например, предположим, что у нас есть система ведения журнала с методом Log
, который возвращаетthis
, чтобы учесть некоторую цепочку методов:
let add x y =
Logger.Log(String.Format("Adding {0} and {1}", x, y)) // #1
x + y // #2
В F #, потому что строка # 1 - это вызов метода, который возвращает значение, и мы ничего не делаем с этим значением, *Считается, что функция 1015 * принимает два значения и возвращает этот экземпляр Logger.Однако строка № 2 также не только возвращает значение, она появляется после того, что F # считает оператором «return» для функции, фактически делая два оператора «return».Это приведет к ошибке компилятора, и нам нужно явно игнорировать возвращаемое значение метода Log
, чтобы избежать этой ошибки, чтобы у нашего add
метода был только один оператор возврата.
let add x y =
Logger.Log(String.Format("Adding {0} and {1}", x, y)) |> ignore
x + y
Как вы можете догадаться, выполнение большого количества вызовов «Свободного API», которые в основном связаны с побочными эффектами, становится несколько разочаровывающим упражнением, разбрасывая множество ignore
операторов повсюду.
Вы, конечно, можетеимейте лучшее из обоих миров и, пожалуйста, разработчики на C # и F #, предоставляя как свободный API, так и модуль F # для работы с вашим кодом.Но если вы не собираетесь этого делать и собираетесь использовать свой API для общего пользования, , пожалуйста , дважды подумайте, прежде чем возвращать this
из каждого метода.