相关疑难解决方法(0)

F#静态成员类型约束

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

generics f# functional-programming constraints

21
推荐指数
3
解决办法
3991
查看次数

如何将LanguagePrimitives.GenericZero/get_Zero添加到System.String?

注意:我最后添加了很多Of interest评论.这些并不是在暗示一个人应该使用inlinestatic 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

8
推荐指数
1
解决办法
341
查看次数

type-parameter支持添加的通用接口

我在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,我可以在我的具体例子中使用另一种解决方案吗?或者我是否必须找到另一种方法来实现这一目标?

generics f#

3
推荐指数
1
解决办法
1530
查看次数

如何避免在.NET中为不同的数字类型编写重复代码

我正在尝试编写通用的Vector2类型,它将包含float,double等类型并使用算术运算.有没有机会在C#,F#,Nemerle或任何其他或多或少成熟的.NET语言中做到这一点?

我需要一个解决方案

  • (1)良好的性能(与我编写单独的Vector2Float,Vector2Double等类相同),
  • (2)这将允许代码看起来不错(我不想在运行时为每个类发出代码)
  • (3)并尽可能多地进行编译时检查.

由于原因1和3,我不想使用动态.现在我正在检查F#和Nemerle.

UPD:我希望这种类型有很多数学代码.但是,如果可能的话,我更愿意将代码放在扩展方法中.

UPD2: 'etc'类型包括int(我实际上怀疑我会使用)和decimal(我想我可以使用,但现在不是).使用扩展方法只是一个品味问题 - 如果有充分理由不这样做,请告诉我们.

c# f# numbers dry nemerle

3
推荐指数
1
解决办法
543
查看次数