У меня есть универсальная функция, использующая статически разрешенные параметры типа
let inline divide a b = a / b
с подписью ^a -> ^a -> ^a
Я могу создать функцию-оболочку
let log f =
let result = f()
printfn "Result: %A" result
result
Если я создам функцию, например
let loggedDivide a b = log (fun () -> divide a b)
его подпись float -> float -> float
вместо ^a -> ^a -> ^a
, что означает
loggedDivide 2.0 5.0
loggedDivide 2 5 //error
Как это можно сделать?
Обратите внимание, что что-то подобное пропускает смысл повторного использования функций
let logValue a = printfn "Result: %A" a
divide 2.0 5.0 |> logValue
divide 2 5 |> logValue
И в этом случае вещи не остаются общими
let logValueAndReturn a =
printfn "Result: %A" a
a
let divideAndLog a b = divide a b |> logValue
divideAndLog 2.0 5.0
divideAndLog 2 5 //error