此构造导致代码的泛型不如类型注释所指示的那样



所以我得到"这个结构导致代码不像类型注释所指示的那样具有泛型"。类型变量"a"已被约束为类型"CountType"。警告,并且该约束在代码的其他位中导致问题。

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

为堆积的代码道歉,我试着减少它并简化一些类型。

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

问题是f#只允许函数是泛型的,所以当你这样做时:

let generatePairs = generatePairsInternal []

generatePairs被认为是一个值(即使它的类型是函数的类型),并且它具有类型约束,如果您将其更改为如下内容:

let generatePairs listA = generatePairsInternal [] listA

最新更新