代码之家  ›  专栏  ›  技术社区  ›  SantiClaus

错误FS0193:类型约束不匹配

f#
  •  0
  • SantiClaus  · 技术社区  · 8 年前

    获取错误:

    error FS0193: Type constraint mismatch. The type 
        'Map<ContentAndYear,DemoMap>'    
    is not compatible with type
        'seq<ContentAndYear * DemoMap>
    

    有问题的代码: Demo 是发生错误的地方。

    type Demo = Map<ContentAndYear,DemoMap>
    
    type ContentAndYear = Content * Year
    
    let demoMap =
        dataMap
        |> Seq.ofList
        |> Seq.map(fun (content, data) ->
            { Content = content
              Year = data.Year
              Person = data.Person
              NullContent = nullContent.[content].contentraw
              PercentContent = nullContent.[content].contentraw
            })
        |> List.ofSeq
    
    let demolist = 
        demoMap
        |> List.map (fun x -> (x.Content,x.Year) |> ContentAndYear,x)
        |> Map.ofList 
    
    let x = demolist |> Demo  <---- Problem Line
    

    如何解决?不确定。

    1 回复  |  直到 8 年前
        1
  •  5
  •   Tarmil    8 年前

    你类型 Demo 不是新类型,而是 Map<ContentAndYear, DemoMap> 所以你的最后一行完全等同于这个:

    let x = demoList |> Map<ContentAndYear, DemoMap>
    

    类型 Map<_,_> 有一个构造函数 seq<'key * 'value> ,但你想通过 地图 编译器自然地抱怨到那个构造函数。

    如何解决这个问题取决于你真正的意思。

    选项1 :如果您对 演示 是你真正想要的 demoMap 已经是类型 演示 ,所以你可以放下 |> Demo 完全地:

    let x = demoMap
    

    选项2 :如果您希望最后一行按原样编译,那么 演示 成为它自己的类型,而不是别名。也就是说,你的意思是让它有一个 地图<内容和年份,演示地图> :

    type Demo = Demo of Map<ContentAndYear, DemoMap>
    
    ...
    
    let x = demoMap |> Demo