我正在尝试定义一个函数,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/