Должны ли явные аргументы типов функций включать в сигнатуру все универсальные типы? - PullRequest
0 голосов
/ 20 марта 2019

Следующий код имеет подпись 'c -> 'c:

let f (x: 'c) = x

Однако следующий код имеет подпись obj -> obj:

let f<'a> (x: 'c) = x

Добавление параметра типа 'c исправляетподпись, возвращая ее к 'c -> 'c:

let f<'a, 'c> (x: 'c) = x

Можно ли явно объявить только некоторые из подписей?Я просто хочу что-то вроде

let f<'a> (x: MyType<'c>) =
  let foo = doSomethingBasedOn typeof<'a>
  processXWithoutCaringAboutTypeC x foo

Это похоже на десериализацию или распаковку, поэтому мне нужны явные аргументы типа для 'a, но мне действительно все равно, тип 'c и не хотел бы явно указывать его (или подстановочный тип).

1 Ответ

2 голосов
/ 20 марта 2019

Чтобы напрямую ответить на ваш вопрос, нет способа включить только подмножество общих параметров в явный список общих параметров (<'a,'b,...>), либо при определении, либо при использовании функции. Но из вашего описания не ясно, что это действительно важно для вашего варианта использования.

  1. То, что вы явно используете аргументы универсального типа в определении функции, не означает, что вам также нужно это делать при вызове функции:

    let f<'a,'c> (x: 'c) = x
    f 1  # works fine with type inference
    
  2. Если возвращаемый тип f каким-то образом включает 'a во втором случае, то вывод типа, вероятно, также позволит вам пропустить явные параметры типа даже при определении f.

Однако, если 'a нигде не фигурирует в сигнатуре f (как часть ввода или вывода), и это влияет на поведение важным образом, то его нужно будет явно указать как введите аргумент при вызове f, потому что нет никакого способа для определения типа F # определить, каким он должен быть, что заставит вас указать и другие аргументы типа (хотя, возможно, в качестве подстановочных знаков).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...