我試圖將一些C#代碼轉換爲F#並遇到輕微問題。這裏是我已經的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'已經在該程序點之前的非統一實例化中使用,考慮重新排序成員,以便該成員首先出現,或者明確指定成員的完整類型,包括參數類型,返回類型和任何其他通用參數和約束。「
和
「本代碼是比所需由其註釋,因爲明確的類型變量‘基因型’不能一概而論較少通用的。它被約束爲‘單元’。」
您會認爲第一個錯誤會很明顯,除非您可以看到我沒有在那之前使用GeneNotTaken成員,這就是爲什麼我不知道問題是什麼。
我的問題的第二部分是如何在方法的末尾添加return default('GeneType)。
如果您有其他一些改進我的代碼的建議,請隨時與我們分享。
再次感謝Tomas! – Beaker 2011-03-13 00:23:13
我想你會注意到這個錯字,但是最後一個循環0在答案的第一部分越位我認爲 – FinnNk 2011-03-13 00:25:12
@FinnNk:謝謝你指出。我確定了答案。 – 2011-03-13 01:37:07