Alo*_*zcz 2 f# inline generic-programming
我写了一个简单的函数来反转给定的数字:
let reverseNumber x =
let rec innerFunc acc elem =
if elem = 0
then acc
else
let rem = elem % 10
innerFunc (10 * acc + rem) (elem / 10)
innerFunc 0 x
Run Code Online (Sandbox Code Playgroud)
问题是它只适用于整数.对于例如,Int64的,我需要创建一个使用另一个版本0L,并10L取代0和10分别.
我听说可以使用内联关键字和LanguagePrimitives编写更多泛型函数,但后者既不包含提醒操作也不包含'GenericTen'(尽管可能通过'GenericOne + GenericOne + ...获得).
你能帮忙吗 ?
忽略@ kvb链接答案的完整性,这是使它成为通用的最小工作:
module NumericLiteralG =
let inline FromZero () = LanguagePrimitives.GenericZero
let inline FromOne () = LanguagePrimitives.GenericOne
let inline reverseNumber (x:^a) =
let ten:^a = 1G + 1G + 1G + 1G + 1G + 1G + 1G + 1G + 1G + 1G
let rec innerFunc (acc:^a) (elem:^a) =
if elem = 0G then acc
else
let (rem:^a) = elem % ten
innerFunc (ten * acc + rem) (elem / ten)
innerFunc 0G x
Run Code Online (Sandbox Code Playgroud)
类型注释不是严格必需的,仅用于减少IntelliSense中列出的类型约束; 如果没有它们,代码将完全相同.