generics - F# 静态成员类型约束

标签 generics f# functional-programming constraints

我正在尝试定义一个函数,factorize,它使用类似于 Seq.sum 的结构类型约束(需要静态成员 Zero、One、+ 和/),以便它可以与 int、long、bigint、等等。我似乎无法正确理解语法,也找不到关于该主题的大量资源。这是我的,请帮忙。

let inline factorize (n:^NUM) =
    ^NUM : (static member get_Zero: unit->(^NUM))
    ^NUM : (static member get_One: unit->(^NUM))
    let rec factorize (n:^NUM) (j:^NUM) (flist: ^NUM list) = 
        if n = ^NUM.One then flist
        elif n % j = ^NUM.Zero then factorize (n/j) (^NUM.One + ^NUM.One) (j::flist)
        else factorize n (j + ^NUM.One) (flist)
    factorize n (^NUM.One + ^NUM.One) []

最佳答案

这是我的写法:

module NumericLiteralG = begin
  let inline FromZero() = LanguagePrimitives.GenericZero
  let inline FromOne() = LanguagePrimitives.GenericOne
end

let inline factorize n = 
  let rec factorize n j flist =  
    if n = 1G then flist 
    elif n % j = 0G then factorize (n/j) j (j::flist) 
    else factorize n (j + 1G) (flist) 
  factorize n (1G + 1G) [] 

此处为因式分解推断的类型太笼统,但该函数将按您的预期工作。如果需要,您可以通过向某些泛型表达式添加显式类型来强制使用更合理的签名和约束集:

let inline factorize (n:^a) : ^a list = 
  let (one : ^a) = 1G
  let (zero : ^a) = 0G
  let rec factorize n (j:^a) flist =  
    if n = one then flist 
    elif n % j = zero then factorize (n/j) j (j::flist) 
    else factorize n (j + one) (flist) 
  factorize n (one + one) []

关于generics - F# 静态成员类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2840714/

相关文章:

swift - 我可以在作为参数传递的类型上专门化泛型函数吗?

java - 如何使用 spring GenericTypeResolver 检查 T 是 String 集合?

f# - 在 F# 中使用字符串路径要求 dll

algorithm - 运算符下计算闭包的高效函数算法

functional-programming - 函数式编程中的大数据结构

java - 如何从 Json 格式的文件中反序列化通用对象

java - 泛型编译错误

f# - 为什么 max(Operator) 不返回最长列表?

oop - 内部和私有(private)有什么区别

python - 在 Python 中的对象上应用函数列表