【问题标题】:F# Compilation error with nested generics嵌套泛型的 F# 编译错误
【发布时间】:2014-11-25 13:40:52
【问题描述】:

我有一个简单的包装器,用于将附加数据添加到任意对象:

type Wrapper<'T>(data:'T) =
  member val Data:'T=data with get
  member val AdditionalProperty:int=0 with get

然后我在一个单链表中使用这些元素,我想将其中的项目限制为Wrapper&lt;'T&gt;,定义了元素:

type LListItem<'T>(data:Wrapper<'T>) =
  member val Data:Wrapper<'T>=data with get
  member val Prev:LListItem<'T> option = None with get, set

然后我假装用这个类来管理链表:

 1| type LList<'T>()=
 2|   let mutable last:LListItem<Wrapper1<'T>> option = None
 3|   member x.Append(wrapped:Wrapper1<'T>)=
 4|     let item = new LListItem<'T>(wrapped)
 5|     match last with
 6|     | None -> 
 7|       last <- Some item
 8|     | Some l -> 
 9|       item.Prev <- last
10|      last <- Some item

但是在这个Append 方法中,我出现了这些编译错误:

  • 第 1 行:此类型参数的使用方式将其限制为始终为 'Wrapper'

  • 第 1 行:此代码的通用性低于其注释所需的通用性,因为无法概括显式类型变量“T”。它被限制为 'Wrapper'。

  • 第 3 行:通用成员“Append”已在此程序点之前的非统一实例化中使用。考虑对成员重新排序,以便首先出现该成员。或者,显式指定成员的完整类型,包括参数类型、返回类型和任何其他泛型参数和约束。

我在这里做一些根本错误的事情,但我不理解编译器消息。

【问题讨论】:

    标签: generics f# linked-list singly-linked-list


    【解决方案1】:

    您收到错误消息,因为类型推断以某种方式推断泛型类型参数'T 始终被限制为Wrapper&lt;'T&gt;。这通常发生在您有一些代码采用 'T 类型的值并将其传递到预期 Wrapper&lt;'T&gt; 的地方。

    在您的情况下,当您在 LList 类型中设置 last 时会发生这种情况。类型注解定义类型为LListItem&lt;Wrapper&lt;'T&gt;&gt; option

    type LList<'T>()=
      let mutable last:LListItem<Wrapper<'T>> option = None
    

    但是当您分配值时,参数是LListItem&lt;'T&gt;。所以你需要把上面的行改成这样:

    type LList<'T>()=
      let mutable last:LListItem<'T> option = None
    

    我怀疑LListItem&lt;Wrapper&lt;'T&gt;&gt; 是一个错误,因为LListItem 总是 接受包装参数。

    编辑:解决此问题的另一个选项是更改LListItem,使其接受包装参数 - 这是 Gustavo 的回答所暗示的。

    【讨论】:

      猜你喜欢
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多