错误FS0193:类型约束不匹配

San*_*aus 0 f#

得到错误:

error FS0193: Type constraint mismatch. The type 
    'Map<ContentAndYear,DemoMap>'    
is not compatible with type
    'seq<ContentAndYear * DemoMap>
Run Code Online (Sandbox Code Playgroud)

有问题的代码: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
Run Code Online (Sandbox Code Playgroud)

怎么解决?不确定.

Fyo*_*kin 5

您的类型Demo不是新类型,而是别名Map<ContentAndYear, DemoMap>,因此您的最后一行完全等同于:

let x = demoList |> Map<ContentAndYear, DemoMap>
Run Code Online (Sandbox Code Playgroud)

该类型Map<_,_>有一个构造函数,它接受一个seq<'key * 'value>,但你试图传递Map<_,_>给那个构造函数,所以编译器自然会抱怨.

如何解决这个问题取决于你的实际意义.

选项1:如果您的定义Demo是您实际想要的,那么demoMap它已经是类型Demo,所以您可以|> Demo完全删除:

let x = demoMap
Run Code Online (Sandbox Code Playgroud)

选项2:如果您希望最后一行按原样编译,那么您可能Demo想要成为自己的类型,而不是别名.也就是说,你的意思是它有一个构造函数Map<ContentAndYear, DemoMap>:

type Demo = Demo of Map<ContentAndYear, DemoMap>

...

let x = demoMap |> Demo
Run Code Online (Sandbox Code Playgroud)