相关疑难解决方法(0)

如何在F#中编写此成员约束?

对于一种类型

type Cow() =
    class
        member this.Walk () = Console.WriteLine("The cow walks.")
    end
Run Code Online (Sandbox Code Playgroud)

我可以编写一个方法来强制执行成员约束方法Walk

let inline walk_the_creature creature =  
    (^a : (member Walk : unit -> unit) creature)
// and then do
walk_the_creature (Cow())
Run Code Online (Sandbox Code Playgroud)

在这种情况下,推断出类型.我无法像这样明确地在creature参数上写一个约束

// Does not compile
// Lookup on object of indeterminate type based on information prior to this 
// program point. A type annotation may be needed...
let inline walk_the_creature_2 (creature:^a when ^a:(member Walk : unit -> unit)) =
    creature.Walk()
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

generics f#

16
推荐指数
1
解决办法
1572
查看次数

F#泛型/函数重载语法

我很困惑如何将函数标记为泛型而没有类似的显式类型声明 ('a -> 'a)

let add a b = a + b
Run Code Online (Sandbox Code Playgroud)

这给了我们

val add : a:int -> b:int -> int
Run Code Online (Sandbox Code Playgroud)

但是我们可以立即打电话

add "Hello " "World!"
Run Code Online (Sandbox Code Playgroud)

现在add的值是

val add : a:string -> b:string -> string
val it : string = "Hello World!"
Run Code Online (Sandbox Code Playgroud)

如果我们再打电话

add 2 3 // then we get
error: This expression was expected to have type string but here has type int
Run Code Online (Sandbox Code Playgroud)

如何确保函数适用于所有已(+)定义函数的类型

generics f# types function

11
推荐指数
1
解决办法
342
查看次数

如何将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
查看次数

通用约束中的F#错误

以下F#代码

let f<'T when 'T: (member Id:int)> (t:'T) = t.Id

不接受以下错误:

错误FS0670此代码不够通用.^ T :(成员get_Id:^ T - > int)时的类型变量^ T无法一般化,因为它会逃避其范围.

怎么了?怎么解决?

编辑

@Fyodor:很棘手!我做了一些测试,发现更多的陌生感:

let inline f1<^T when ^T: (member Id:int)> (t:^T) = ( ^T: (member Id:int) t )

let inline f2<'T when 'T: (member Id:int)> (t:'T) = ( 'T: (member Id:int) t )

let inline f3<'T when 'T: (member Id:int)> (t:'T) = ( ^T: (member Id:int) t )

let inline f4 t = ( ^T: (member Id:int) t )
Run Code Online (Sandbox Code Playgroud)

f1在<^ T中给出错误 …

f# generic-constraints

7
推荐指数
1
解决办法
198
查看次数

请解释一下这个语法

kvb关于如何调用隐式转换运算符的回答:

let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)
Run Code Online (Sandbox Code Playgroud)

我已经知道F#了一段时间,但我不知道如何解析这里的实现.什么是(^a or ^b)?之后的东西?请仔细阅读每个部分所代表的内容.

f#

2
推荐指数
1
解决办法
86
查看次数