Generics 此构造导致代码不像类型注释所指示的那样通用

Generics 此构造导致代码不像类型注释所指示的那样通用,generics,types,f#,Generics,Types,F#,因此,我得到了“此构造导致代码没有类型注释所指示的那么通用。类型变量'a已被约束为'CountType'类型”的警告,并且该约束导致代码的其他位出现问题 我尝试过使类型显式泛型,但它不起作用。我把这个代码放在上面,使它更容易使用 为堆积如山的代码道歉,我试着把它删减并简化一些类型 module Stuff type CountType = Container of seq<string> * int | Collection of seq<CountType> * in

因此,我得到了“此构造导致代码没有类型注释所指示的那么通用。类型变量'a已被约束为'CountType'类型”的警告,并且该约束导致代码的其他位出现问题

我尝试过使类型显式泛型,但它不起作用。我把这个代码放在上面,使它更容易使用

为堆积如山的代码道歉,我试着把它删减并简化一些类型

module Stuff

type CountType = Container of seq<string> * int | Collection of seq<CountType> * int
type Label = string * seq<string> * int

let rec generatePairsInternal (buffer:('a*'a) list) (seqa: 'a list)(seqb: 'a list) =
    match seqa with
    | head::tail -> 
        let newBuffer = seqb |> List.map (fun x->(head,x)) |> List.append buffer 
        generatePairsInternal newBuffer tail seqb
    |_  -> buffer

let generatePairs = generatePairsInternal [] 

let ($) f (a,b) = f a b

let funcOnceWithEachPair (func:'a->'a->'b option) (seqa:'a seq) (seqb: 'a seq): 'b option list =
    let (lista,listb) = (seqa |> Seq.toList, seqb |> Seq.toList)
    let pairs = generatePairs lista listb
    pairs |> List.map (($) func)

let crossAndDiscard func children1 children2 =
    (funcOnceWithEachPair func children1 children2) |> List.filter Option.isSome |> List.map Option.get//This is probably bad.

let countTypeFunc (countType1:CountType) (countType2:CountType) = 
    Some countType1 

let doSomethingRandom (countTypes1:CountType list) (countTypes2:CountType list): CountType list =
    crossAndDiscard countTypeFunc countTypes1 countTypes2

let labelFunc (label1:Label) (label2:Label) = 
    Some label1 

let doSomethingRandom (countTypes1:Label list) (countTypes2:Label list): Label list =
    crossAndDiscard labelFunc countTypes1 countTypes2
模块内容
type CountType=seq*int的容器| seq*int的集合
类型标签=字符串*seq*int
让rec生成内部(缓冲区:('a*'a)列表)(seka:a列表)(seqb:a列表)=
将Seka与
|头:尾->
让newBuffer=seqb |>List.map(funx->(head,x))|>List.append缓冲区
发电机内部新缓冲器尾部序列B
|_->缓冲器
让generatePairs=generatePairsInternal[]
设($)f(a,b)=f a b
让Funconcewachpair(func:'a->'a->'b选项)(seqa:'a seq)(seqb:'a seq):'b选项列表=
let(lista,listb)=(seqa |>Seq.toList,seqb |>Seq.toList)
让pairs=generatePairs lista listb
pairs |>List.map(($)func)
让crossAndDiscard func children1 children2=
(funconcewatchair func children1 children2)|>List.filter Option.isSome |>List.map Option.get//这可能不好。
设countTypeFunc(countType1:CountType)(countType2:CountType)=
一些countType1
让doSomethingRandom(countTypes1:CountType列表)(countTypes2:CountType列表):CountType列表=
crossAndDiscard countTypeFunc countTypes1 countTypes2
设labelFunc(label1:Label)(label2:Label)=
一些标签1
让doSomethingRandom(计数类型1:标签列表)(计数类型2:标签列表):标签列表=
交叉并丢弃labelFunc计数类型1计数类型2
问题在于F#只允许函数是泛型的,因此当您这样做时:

let generatePairs = generatePairsInternal []
generatePairs
被视为一个值(即使它的类型是函数的类型),并且如果您将其更改为类似以下内容,它的类型将受到约束:

let generatePairs listA = generatePairsInternal [] listA

它应该可以工作。

顺便说一下,您可以替换
List.filter Option.isSome |>List.map选项。使用
List.choose id获取
。)此外,还定义了两次
doSomethingRandom
——不能重载函数,只能重载方法。