Есть 2 проблемы с кодом:
Во-первых, универсальный тип 'T
не используется ни одним из параметров.Параметры должны быть объявлены типа 'T
следующим образом:
// val add_stuff: 'T -> 'T -> unit
let add_stuff<'T> (x:'T) (y:'T) =
printfn "%A" (x + y)
Это создает новое сообщение об ошибке:
Объявленный параметр типа 'T' не может использоваться здесьпоскольку параметр типа не может быть разрешен во время компиляции
В этом случае проблема заключается в операторе +
.Он использует Статически Разрешенные Параметры Типа, что означает, что ваша функция также должна использовать их, что в основном означает, что он должен быть встроенным:
// val add_stuff: ^T -> ^T -> unit
let inline add_stuff (x:^T) (y:^T) =
printfn "%A" (x + y)
Обратите внимание на разницу в сигнатуре типа 'T
является универсальным типом, он можетбыть решенным во время выполнения.^T
- это SRTP, его необходимо разрешить во время компиляции, поэтому ключевое слово inline
.
Если бы вы не использовали оператор +
, вам не нужно было бы его вставлять.Обратите внимание на разницу между pair_stuff
и add_stuff
:
// val pair_stuff: 'T -> 'W -> unit
let pair_stuff (x:'T) (y:'W) =
printfn "%A" (x , y)
// val add_stuff: ^a -> ^b -> unit
let inline add_stuff x y =
printfn "%A" (x + y)
let stuff() =
add_stuff 5.5 2.4
add_stuff 3 4
pair_stuff 5.5 2.4
pair_stuff 3 4
stuff()
// 7.9
// 7
// (5.5, 2.4)
// (3, 4)