【发布时间】:2011-07-14 06:06:55
【问题描述】:
我正在尝试将一些 C# 代码转换为 F#,但遇到了一个小问题。这是我已经拥有的 F# 代码:
open System
open System.Collections
open System.Collections.Generic
type Chromosome<'GeneType>() =
let mutable cost = 0
let mutable (genes : 'GeneType[]) = Array.zeroCreate<'GeneType> 0
let mutable (geneticAlgorithm : GeneticAlgorithm<'GeneType>) = new GeneticAlgorithm<'GeneType>()
/// The genetic algorithm that this chromosome belongs to.
member this.GA
with get() = geneticAlgorithm
and set(value) = geneticAlgorithm <- value
/// The genes for this chromosome.
member this.Genes
with get() = genes
and set(value) = genes <- value
/// The cost for this chromosome.
member this.Cost
with get() = cost
and set(value) = cost <- value
/// Get the size of the gene array.
member this.Size = genes.Length
/// Get the specified gene.
member this.GetGene(gene:int) =
genes.[gene]
member this.GeneNotTaken(source:Chromosome<'GeneType>, taken:IList<'GeneType>) =
let geneLength = source.Size
for i in 0 .. geneLength do
let trial = source.GetGene(i)
if(not (taken.Contains(trial))) then
taken.Add(trial)
trial
一切都很顺利,直到我开始使用基因未采取方法。这是该方法的 C# 代码(我还需要帮助返回默认类型,但还没有做到那么远):
private GENE_TYPE GetNotTaken(Chromosome<GENE_TYPE> source,
IList<GENE_TYPE> taken)
{
int geneLength = source.Size;
for (int i = 0; i < geneLength; i++)
{
GENE_TYPE trial = source.GetGene(i);
if (!taken.Contains(trial))
{
taken.Add(trial);
return trial;
}
}
return default(GENE_TYPE);
}
我看到的编译器错误包括:
“通用成员 'GeneNotTaken' 已在此程序点之前的非统一实例化中使用。考虑重新排序成员,以便首先出现此成员。或者,显式指定成员的完整类型,包括参数类型,返回类型以及任何其他泛型参数和约束。”
和
“此代码没有其注释要求的通用性,因为显式类型变量 'GeneType' 无法泛化。它被限制为 'unit'。”
您会认为第一个错误非常清楚,除非您可以看到在那之前我没有使用 GeneNotTaken 成员,这就是为什么我不知道问题出在哪里。
我的问题的第二部分是如何在方法的末尾添加 return default('GeneType) 。
如果您对改进我的代码有其他建议,请随时分享。
【问题讨论】:
标签: generics f# types annotations c#-to-f#