F#静态成员类型约束

编程入门 行业动态 更新时间:2024-10-20 13:37:57
本文介绍了F#静态成员类型约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我试图定义一个函数,factorize,它使用结构类型约束(需要静态成员零,一,+和/)类似于Seq.sum,以便它可以与int,long,bigint,等等。我似乎不能得到正确的语法,并且找不到很多关于这个主题的资源。

让inline factorize(n:^ NUM)= ^ NUM: (static member get_Zero:unit->(^ NUM)) ^ NUM:(static member get_One:unit->(^ NUM)) let rec factorize(n:^ NUM) :^ NUM)(flist:^ NUM list)= 如果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)[]

解决方案

这里是我写的:

模块NumericLiteralG = begin let inline FromZero()= LanguagePrimitives.GenericZero let inline FromOne()= LanguagePrimitives.GenericOne end let inline factorize n = let rec factorize nj flist = if n = 1G then flist elif n%j = 0G then factor (n / j)j(j :: flist) else factorize n(j + 1G)(flist) factorize n(1G + 1G)[]

这里推断的factorize类型太笼统了,但是函数会按照你的期望工作。如果您希望通过向某些通用表达式添加显式类型,可以强制使用更加完整的签名和约束集:

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

I'm trying to define a function, factorize, which uses structural type constraints (requires static members Zero, One, +, and /) similar to Seq.sum so that it can be used with int, long, bigint, etc. I can't seem to get the syntax right, and can't find a lot of resources on the subject. This is what I have, please help.

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) []

解决方案

Here's how I'd write it:

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) []

The type inferred for factorize here is way too general, but the function will work as you'd expect. You can force a more sane signature and set of constraints if you want by adding explicit types to some of the generic expressions:

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) []

更多推荐

F#静态成员类型约束

本文发布于:2023-11-10 02:34:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1574094.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:静态   成员   类型

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!