相关疑难解决方法(0)

F#泛型类型约束和duck typing

我正在尝试在F#中实现duck typing,我发现你可以在F#泛型中有一个成员约束,如下所示:

type ListEntryViewModel<'T when 'T : (member Name : string)>(model:'T) = 
  inherit ViewModelBase()

  member this.Name with get() = model.Name
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试引用该属性时,上面的代码将无法编译.我收到编译器错误:

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

是否可以通过通用约束实现鸭子类型?

generics f# inline

9
推荐指数
3
解决办法
3807
查看次数

静态分辨的类型参数

以下(简化)代码段取自我正在实现的应用程序,该应用程序始终使用静态解析的类型参数.

type A< ^B when ^B : (static member MyMember : Unit -> Unit)> = {
  Field : unit
}
type TestA = {
  AField : A< BTy >
}
and BTy = {
  BField : Unit
} with
  static member MyMember () = ()
Run Code Online (Sandbox Code Playgroud)

当我定义字段AField(AField : A< BTy >)的类型时,IntelliSense给出了以下错误:类型'BTy'不支持任何名为'MyMember'的运算符.

编辑.单独声明它们是有效的,但如果我有一个共同引用,我不能声明第三种类型放在顶部,其中包含两种类型的公共信息.我该怎么做才能避免这个问题?无论如何,如果我在下面定义let pluto = ("" :> obj) :?> A< BTy >它的定义,我想是因为这两种类型都是从let绑定中可见的.

parameters f# types

5
推荐指数
2
解决办法
1365
查看次数

标签 统计

f# ×2

generics ×1

inline ×1

parameters ×1

types ×1