【发布时间】:2014-01-14 21:09:51
【问题描述】:
使用以下列方式实现的基因组类型
type Genome<'T> (listIn : List<'T>)=
member this.list = listIn
member this.GetValues() =
this.list
我在编写另一个代码片段时遇到了问题。
type IMutation =
abstract member MutateMethod: Genome<'T> -> Genome<'T>
type DoubleGenomeMutation() =
member this.Mutate = (this :> IMutation).MutateMethod
interface IMutation with
member this.MutateMethod(genome: Genome<'T>) =
let randomIndex = MyRandom.Next(0, genome.list.Length)
printfn "%d" randomIndex
let newValue = MyRandom.NextDouble(Parameters.LowerBounds.Item(randomIndex), Parameters.UpperBounds.Item(randomIndex))
let (newGenomeList : List<'double>, _) =
List.foldBack (fun elem acc ->
match acc with
| (l, 0) -> (newValue::l, -1)
| (l, i) -> (elem::l, i-1)) (genome.GetValues()) ([], genome.GetValues().Length - randomIndex - 1)
new Genome<'T>(newGenomeList)
我发现这里不可能正确使用泛型机制。
中引用的示例效果Error 2 Type mismatch. Expecting a
float list
but given a
List<'a>
The type 'float' does not match the type ''a'
排队
| (l, i) -> (elem::l, i-1)) (genome.GetValues()) ([], genome.GetValues().Length - randomIndex - 1)
在类似情况下,向上或向下转换变量通常被描述为解决方案 - 不幸的是,我无法以这种方式修复我的程序。我将不胜感激任何直接帮助以及有关所有问题根源的任何建议。
【问题讨论】:
-
我打赌你在顶部有一个
open System.Collections.Generic并且正在与那里的列表类型造成一些混淆 -
可能根本没有。我没有在任何地方使用 System.Collections.Generic,只有不可变的 F# 列表。
-
如果将签名从
List<'a>更改为'a list会发生什么? -
不幸的是没有什么令人兴奋的。
Error 2 Type mismatch. Expecting a float list but given a 'a list The type 'float' does not match the type ''a' -
MyRandom.NextDouble的返回类型是什么?
标签: .net generics casting f# type-conversion