我正在尝试定义一个函数,factorize,它使用类似于Seq.sum的结构类型约束(需要静态成员Zero,One,+和/),以便它可以与int,long,bigint等一起使用.I似乎无法获得正确的语法,并且无法在该主题上找到很多资源.这就是我所拥有的,请帮助.
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) []
Run Code Online (Sandbox Code Playgroud) 注意:我最后添加了很多Of interest评论.这些并不是在暗示一个人应该使用inline和static type parameters 威利愿意不愿意,他们有这么一个没有花时间搜索大量的SO与此相关的问题,以更好地理解这些概念的问题.
我知道当需要使函数通用并且需要零(0)值时,F#提供GenericZero.
解析为任何原始数字类型的零值或具有名为Zero的静态成员的任何类型.
所以这让我相信使用GenericZero字符串类型我只需要添加一个名为Zero的静态成员.
由于System.String是.Net框架的一部分,修改.Net源代码不是应该做的.但是,F#提供了Type Extensions.
类型扩展允许您将新成员添加到先前定义的对象类型.
此外,F#提供了String模块,但缺少GenericZero.
有关创建类型扩展的好教程,请参阅:将函数附加到类型.
我测试的代码:
这是在一个名为的项目中 Library1
namespace Extension.Test
module Extensions =
type System.String with
static member Something = "a"
static member StaticProp
with get() = "b"
static member Zero
with get() = "c"
Run Code Online (Sandbox Code Playgroud)
这是在一个名为的项目中 Workspace
namespace Extension.Test
module main =
open Extensions
[<EntryPoint>]
let main argv =
let stringSomething = System.String.Something
printfn …Run Code Online (Sandbox Code Playgroud) generics extension-methods f# type-inference generic-constraints
我在F#中试图创建一个通用接口,其中类型参数必须支持添加,所以我最终得到这样的东西:
type IMyInterface<'b when 'b : (static member (+) : 'b * 'b -> 'b)> =
abstract member myFunction : 'b -> 'b
Run Code Online (Sandbox Code Playgroud)
不幸的是,这段代码给了我以下错误:
此代码不够通用.类型变量^ D当^ D:比较和^ D :(静态成员(+):^ D*^ D - > ^ D)无法推广,因为它会逃避其范围.
我发现了关于同样问题的这个问题,但我不确定我理解为什么必须将该功能标记为inline.
此外,既然你不能成为一个抽象的成员inline,我可以在我的具体例子中使用另一种解决方案吗?或者我是否必须找到另一种方法来实现这一目标?
我正在尝试编写通用的Vector2类型,它将包含float,double等类型并使用算术运算.有没有机会在C#,F#,Nemerle或任何其他或多或少成熟的.NET语言中做到这一点?
我需要一个解决方案
由于原因1和3,我不想使用动态.现在我正在检查F#和Nemerle.
UPD:我希望这种类型有很多数学代码.但是,如果可能的话,我更愿意将代码放在扩展方法中.
UPD2: 'etc'类型包括int(我实际上怀疑我会使用)和decimal(我想我可以使用,但现在不是).使用扩展方法只是一个品味问题 - 如果有充分理由不这样做,请告诉我们.