Версія функції - це коротка рука для синтаксису повного збігу в особливому випадку, коли оператор збігу - це ціла функція, а функція має лише один аргумент (кортежі вважаються одним). Якщо ви хочете мати два аргументи, то вам потрібно використовувати синтаксис повного збігу *. Ви можете побачити це у типах наступних двох функцій.
//val match_test : string -> string -> string
let match_test x y = match x, y with
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
//val function_test : string * string -> string
let function_test = function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"
Як бачите, версія збігу приймає два окремі аргументи, тоді як функціональна версія приймає один зведений аргумент. Я використовую версію функції для більшості функцій з одним аргументом, оскільки я вважаю, що синтаксис функції виглядає чистішим.
* Якщо ви дійсно хотіли, ви можете отримати версію функції, щоб мати правильний підпис типу, але це виглядає досить потворно, на мій погляд - див. Приклад нижче.
//val function_match_equivalent : string -> string -> string
let function_match_equivalent x y = (x, y) |> function
| "A", _ -> "Hello A"
| _, "B" -> "Hello B"
| _ -> "Hello ??"