Ввод поля записи для хранения функции с аргументами типа - PullRequest
0 голосов
/ 10 октября 2018

Учитывая функцию, определенную как let get<'T> var1 var2 : 'T option какой тип подписи должен быть задан для поля записи, которому будет назначена функция?

Я пробовал различные перестановки type MyType = {AFunc<'T> : obj -> obj -> 'T option}, но не могу найтилюбой вариант, который позволяет мне ввести аргумент типа.

Я могу сделать это type MyType = {AFunc: obj -> obj -> obj option}, и это позволит мне создать запись {AFunc = get}, но затем не сможет применить функцию, поскольку аргумент типа отсутствует.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

В вашем вопросе есть некоторая двусмысленность.Вы хотите иметь возможность хранить get<'t> в записи для одной конкретной 't для каждой записи, или вы хотите, чтобы сама запись сохраняла «универсальную» функцию, такую ​​как get<_>?

Если первое, то TeaDrivenDev s ответ будет работать.

Если последнее, то не существует абсолютно простого способа сделать это с системой типов F #: поля записи не могут быть общими значениями.

Однако, есть достаточно чистый обходной путь, который заключается в объявлениитип интерфейса с универсальным методом и сохраните экземпляр интерфейса в вашей записи, например:

type OptionGetter = abstract Get<'t> : obj->obj->'t option
type MyType = { AFunc: OptionGetter }
let get<'t> var1 var2 : 't option = None // your real implementation here
let myRecord = { AFunc = { new OptionGetter with member this.Get v1 v2 = get v1 v2} }
let test : int Option = myRecord.AFunc.Get "test" 23.5
0 голосов
/ 10 октября 2018

Вы должны сделать сам тип записи общим;только тогда будет определено и использовано 'T.

type MyType<'T> = { AFunc : obj -> obj -> 'T option }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...