F # Преобразовать в литеральный тип, предоставляемый во время выполнения - PullRequest
0 голосов
/ 27 августа 2018

Иными словами, если я хочу полностью универсальную функцию, как обеспечить преобразование во время компиляции / выполнения между числовыми типами.

Например:

let f x = x + 1 // int -> int

автоматически предполагаетint из-за 1.

Мой текущий взлом на это:

let gettype (x:'T) = typeof<'T>  // 'T -> Type
let one x = Convert.ChangeType (1, (gettype x))  // 'a -> obj
let f x = x + one(x) // obj -> obj

Но это не работает, поскольку + не определено для objs

1 Ответ

0 голосов
/ 27 августа 2018

Если вы хотите полностью универсальную функцию, которая добавляет одну к аргументу, я предлагаю вам использовать LanguagePrimitives.GenericOne:

let inline f x = x + LanguagePrimitives.GenericOne

Обратите внимание, что вам также необходимо встроить свою функцию,потому что в противном случае оператор (+) не может быть универсальным.

...