Как указать тип результата для подписи функции F #? - PullRequest
0 голосов
/ 14 апреля 2020

Я все еще немного новичок в F #, я вижу себя борющимся с некоторыми сигнатурами функций, когда компилятор не может правильно определить тип. В следующем примере компилятор полагал, что тип функции для TryParse был string -> string, поэтому мне пришлось создать это определение с лямбдой справа.

type SocialAccount =
    | FacebookAccount
    | UnknownAccount
type SocialAccount with
    static member TryParse:(string -> SocialAccount option) = fun s ->
        match s with
        | "FACEBOOK" -> Some FacebookAccount
        | _ -> None

Я считаю, что лямбда-выражение после равного я думаю, что это немного уродливо, и разделение имен arg от типов делает его немного нечитаемым. Кроме того, создание типа для каждой сложной функции создает переполненные пространства имен.

Неужели нет способа определить функцию и указать ее тип возвращаемого значения? Я ищу что-то вроде следующего кода (который является неправильным):

static member TryParse:(s:string -> SocialAccount option) =
  match s with
    | "FACEBOOK" -> Some FacebookAccount
    | _ -> None

Все предложения приветствуются. В том числе креативные.

1 Ответ

1 голос
/ 14 апреля 2020

Вы можете поместить аннотацию типа для возвращаемого значения в конце строки объявления:

static member TryParse(s: string): SocialAccount option =

Кроме того, static member X = fun ... -> не эквивалентно static member X(...) =. Первый создает свойство, а не метод.

...