generics - F#中的通用字符串到整数转换

标签 generics f#

我正在 F# 中实现一个简单的字符串到整数转换器的转换;逻辑是,例如从 stringuint32:

let inline sToUint s =
    let mutable v = 0u

    for c in s do
        v <- v * 10u + uint32 c - uint32 '0'

    v

现在我想将此实现用于其他整数类型,例如uint64。我怎样才能实现一个通用函数来做到这一点?

谢谢大家,SRTP(如答案中所用)是我在这种情况下所需要的。以下实现与@Brian Berns 的答案略有不同

// (char -> ^a) -> (string -> ^b)
let inline sToNum f =
    let tenTimes v = (v <<< 3) + (v <<< 1)
    fun (s: string) ->
        let mutable v = Unchecked.defaultof<_>
        for c in s do
            v <- (tenTimes v) + f c - f '0'
        v

最佳答案

你可以这样做:

let inline sToNum f =
    let ten = Seq.replicate 10 LanguagePrimitives.GenericOne |> Seq.sum
    fun s ->
        let mutable v = LanguagePrimitives.GenericZero
        for c in s do
            v <- v * ten + f c - f '0'
        v

let sToUint16 = sToNum uint16
let sToUint32 = sToNum uint32
let sToUint64 = sToNum uint64
let sToInt16 = sToNum int16
let sToInt32 = sToNum int32
let sToInt64 = sToNum int64

测试代码:

sToUint16 "123" |> printfn "%A"   // 123us
sToUint32 "123" |> printfn "%A"   // 123u
sToUint64 "123" |> printfn "%A"   // 123UL
sToInt16 "123" |> printfn "%A"    // 123s
sToInt32 "123" |> printfn "%A"    // 123
sToInt64 "123" |> printfn "%A"    // 123L

请注意,sToNum 返回一个 lambda,因此它不必每次都重新计算 10。 (您甚至可以缓存 f '0' 的值,以节省更多时间。)

关于generics - F#中的通用字符串到整数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70804443/

相关文章:

f# - 从文件中获取配置值,如果文件不存在则获取环境变量

java - 如何在java中查找通用单链表的大小

generics - 接受受多个特征中的任何一个约束的参数的函数

.net - 使用 F# 进行简单的 .NET Web 开发

.net - F#-在dotnet 5中使用Concurrent.ConcurrentDictionary.TryRemove

algorithm - 构建具有最大值的表达式

java - 原始 int 也是 Comparable 吗?

Java:接口(interface)中的引用 "own type"

c# - 在 MEF 2 中使用封闭类型组合开放通用类型

.net - 与可区分联合相比,在 F# 中使用记录类型时更加详细