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

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我需要创建另一个版本,分别使用0L10L而不是010

我听说有可能使用内联关键字和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中列出的类型约束。没有它们,代码将完全相同。

关于f# - 该函数适用于所有数值数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23944543/

10-09 13:35