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