F# 函数适用于所有数值数据类型

F# 函数适用于所有数值数据类型,f#,inline,generic-programming,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 问题

我编写了一个简单的函数,可以反转给定的数字:

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
问题是它只适用于int。例如,对于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
类型注释不是严格必需的,仅用于减少IntelliSense中列出的类型约束;如果没有它们,代码将以相同的方式工作。

请参阅,但请注意,它不能正确处理负文本(为此,请参阅)。