Сопоставление образцов с аннотациями типов - PullRequest
5 голосов
/ 18 мая 2019

В https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/pattern-matching#tuple-pattern, приведен пример шаблона с аннотацией типа:

Шаблоны могут иметь аннотации типов.Они ведут себя как аннотации других типов и ведут вывод как аннотации других типов.Круглые скобки обязательны для аннотаций типов в шаблонах.В следующем коде показан шаблон с аннотацией типа.

let detect1 x =
      match x with
      | 1 -> printfn "Found a 1!"
      | (var1 : int) -> printfn "%d" var1
  detect1 0
  detect1 1

Примечание типа (var1 : int) является избыточным, поскольку литерал 1 в предыдущем шаблоне однозначно устанавливает тип.

Есть ли какой-нибудь случай, когда аннотация типа, такая как эта, будет полезна?

1 Ответ

2 голосов
/ 18 мая 2019

На самом деле, даже когда вы используете аннотацию типа в параметрах функции, вы также используете аннотацию типа в шаблонах. Сопоставление с шаблоном F # работает даже с параметрами функции (let привязка в целом).

Так что, как обычно, аннотация типа полезна, когда мы хотим немедленно применить тип вместо того, чтобы полагаться на вывод типа. У нас может быть много мест для размещения аннотации типов для достижения того же результата. Просто выберите место, наиболее удобное для ситуации. Рассмотрим пример ниже:

let detect2 (x : int option) =
    match x with
    | Some y -> ...
    | None -> ...

Мы можем написать короче:

let detect2 x =
    match x with
    | Some (y : int)
    | None -> ...

В этой ситуации нам следует предпочесть более позднюю.

...