Szablony funkcji w F #
Powiedzmy, że rozwiązuję konkretny problem i wymyślam funkcję
let function parameter1 ... =
a lot of adding, multiplying & so on with a lot of
literals all over the place
Teraz ta funkcja działa dobrze, jeśli moje parametry są typu int. Ale gdzieś będę potrzebował go do 11, potrzebuję tego dodatkowego push do int64 lub nawet BigIntegera. Więc co mam zrobić? Kopiuję i wklejam funkcję, zmieniam nazwę i zaczynam polować na wszystkie literalne wystąpienia, które sprawiają, że kompilator uważa, że funkcja powinna działać na int. I to do bani.
Czy jest na to sposób:
let greatFunction param1 param2 = (param1+1)/(param2*2)
gdzie param1 i param2 mogą być dowolnymi kombinacjami typów całkowitych?
Edytować:
Rozszerzając nieco na świetną wskazówkę kvb poniżej, wymyśliłem następujące
module NumericLiteralG
let inline FromZero() = LanguagePrimitives.GenericZero
let inline FromOne() = LanguagePrimitives.GenericOne
let inline FromInt32 n =
let rec loop nIn nOut =
if nIn>0 then loop (nIn - 1) (nOut + LanguagePrimitives.GenericOne)
else nOut
loop n LanguagePrimitives.GenericZero
dzięki temu staje się nieco mniej brzydki
let inline halfSquare num =
let res = num / 2G
res * res
let solve1 = halfSquare 5I
let solve2 = halfSquare 5.0
let solve3 = halfSquare 5uy
Teraz pytanie brzmi: czy powinienem to wykorzystać? Jeśli nie, dlaczego nie?